这个帖子在之前有看到过,但里面的回答有些看不懂,有些人说会回收,有些人说不会变,有些人说值是随机的
希望各位能解答下,我是个初学者,有很多操作符不知道什么意思,希望能回答的简洁一点
至于我为什么会想这个,是因为在自定义函数没返回的值不是会回收吗?但如果返回一个数组的首地址,那如果超标了,超标的值还会存在吗?不存在的话,没超标的那部分还存在吗?
就比如:
在自定义函数定义了
int* s(){
int a[2]={1,2};
a[2]=3;
return a;
}
然后在主函数
int* p;
p=s();
printf("%d %d %d",p[0],p[1],p[2]);
这样的话1 2 3能正常输出吗?3会不会因为超标后被回收而输出随机值,还是直接程序错误不能输出?1 2会不会因为传了s的首地址而正常输出不被回收,还是只有1被返回,或者压根不能直接返回数组的地址?
这个帖子有两个问题
一个是如标题一样广义的,一个是我提的案例里狭义的
(因为我有些地方没表达清楚,我后面又稍微改了下)
6条回答 默认 最新
- 语言-逆行者 2023-04-17 14:37关注本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 1无用 1
自定义函数运行完后,其中的局部变量和参数都会被释放,不会保留。如果函数有return语句并返回了一个值,那么这个返回值是会保留的,可以被调用该函数的代码使用。
当函数返回数组首地址时,实际上传递的也只是数组首地址,而不是整个数组。但是由于在内存中,数组中的元素是按照顺序排列且占用一段连续的空间,因此偏移量加上首地址就可以访问整个数组的元素。这些元素所占用的内存空间只有在程序运行期间才会被回收。
举个例子,如果在函数中定义了一个数组并返回它的首地址,但是在函数外部没有定义该数组,那么这个数组所占用的内存空间会一直保留,直到程序结束。如果后续代码再次使用了这个数组的地址,就可以继续访问到这个数组的内容。但是需要注意的是,在函数中分配的堆内存空间需要手动释放,否则会导致内存泄漏。
赞回复展开全部7条评论