首先我们来看这个错误代码
首先我们看代码逻辑,首先main函数调用test,test接收的是void类型,设置一个指针变量,指向null,传递给get函数,也就是传递一个空指针给getmemory函数,这个函数接收了,然后进行运算。
接下来我们进行分析代码的错误逻辑。
为什么不取地址是错误的呢,
- 传递地址(指针的指针): 当你传递
&str
(str
的地址)给函数时,你是在告诉函数你想要操作的是str
变量的内存地址本身。这允许函数直接修改str
变量的值,或者使用str
变量的地址进行其他操作。 - 传递指针(不取地址): 当你传递
str
(指向char
的指针)给函数时,你是在告诉函数你想要操作的是str
指向的字符串。函数可以通过str
指针访问和修改字符串的内容,但不会直接修改str
指针本身的值。
这样会导致什么情况呢,就是内存销毁的问题,你这个函数传递的时候,传递的是指针,不是指针的地址。那么此时就会产生一种情况那就是,getmemory函数运算结束,这个函数进行了销毁。
因为他调用结束之后,函数会进行销毁,strcpy函数想拷贝到开辟的空间里面,OK!找不到空间了,因为进行了销毁。
什么意思呢,可以理解为,
张三,有一天忙碌完,不想回家了,在公司楼下开了个酒店住进去了,哎,很不错,告诉李四,我住的209房间特别好,你有空可以去试试。第二天李四也累了,那我也去了,我到地方我就记得209房间,但是张三的209房间已经退房了,那我肯定进不去,我非得进去,那就被保安打一顿。
你这里也是这样,你这里 想拷贝字符创,那可以没问题。关键点在于你这里传递的是数值,他不是地址,那数值的话,函数创建了,然后运行结束进行销毁。你自然找不到房间号。你这里要是传递的是空间的地址,那我可以直接去你的地址进行操作拷贝,你也不需要进行返回什么的,哪怕进行销毁了,那也没事。
1.因为这里传参传递的是数值,函数返回的时候进行了函数的销毁,从而导致非法访问
这里的意思 应该是把100个字节放到str里面去 但是传值调用是不行的 会导致有问题
正确的处理应该是什么呢
我们可以把str取地址,传参传的是地址,然后因为本身str已经是指针,我们采取用二级指针的方式进行接收,也就是指向的是指针的地址,
修改为正确代码1
此时就可以完成任务了
修改为正确代码2
当然 不喜欢二级指针 也可以进行数值的接受 也就是char*
找个数值进行接收,找个数值进行接收,那就是有返回类型,我们采取的返回类型是char*类型,因为这里是拷贝字符串。接收返回值也是一样的。
提示一下,所以其实不传参也是可以的
图解