Asuka y 2023-04-17 14:08 采纳率: 100%
浏览 91
已结题

内存空间被收回,存在里面的数据是不是也没有了?(语言-c语言)

这个帖子在之前有看到过,但里面的回答有些看不懂,有些人说会回收,有些人说不会变,有些人说值是随机的
希望各位能解答下,我是个初学者,有很多操作符不知道什么意思,希望能回答的简洁一点
至于我为什么会想这个,是因为在自定义函数没返回的值不是会回收吗?但如果返回一个数组的首地址,那如果超标了,超标的值还会存在吗?不存在的话,没超标的那部分还存在吗?
就比如:
在自定义函数定义了
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
    关注

    当一个函数运行完毕后,其内部定义的变量和数组等数据都会被存储在栈内存中,随着函数的结束而被收回。执行完毕的函数的栈帧将从堆栈中弹出,以便为其他函数腾出空间。
    如果函数返回一个指向数组首地址的指针,那么在主函数中可以继续访问这个数组。但是,如果您超过了数组的长度范围去访问数组元素,则会发生未定义的行为。这是因为C语言没有提供越界访问检查机制,程序会简单地将越界访问视为普通的内存读写操作,从而可能导致不可预期的结果。

    因此,如果您要使用动态分配的内存,请务必小心谨慎地进行内存管理,确保您不会在使用之前或之后释放了内存,也不要访问越界的内存区域。
    【对于你的例子说明:】

    在这个示例中,当调用函数s()时,将创建一个包含两个整数的数组a,并将其初始化为{1, 2}。然后,程序尝试将a[2]赋值为3,但是a数组只有两个元素,因此这会导致数组越界并导致未定义的行为。由于函数s()返回了一个指向a数组第一个元素的指针,因此在主函数中,打印p指向的整型数组的前三个元素时,也将访问a数组的元素。
    因为程序进行了数组越界操作,所以程序的行为是不确定的,可能会导致崩溃或错误的输出。即使您成功地打印了p[0]和p[1],p[2]的输出结果也是未定义的,并且可能会受到其他代码、编译器和操作系统因素的影响。
    因此,为了避免这种未定义行为,应该正确地使用数组并确保不会超出数组的边界。同时注意及时释放内存,防止内存泄漏。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
    语言-逆行者 2023-04-17 14:48

    有问题欢迎交流哈

    1
    回复
    Asuka y 回复 语言-逆行者 2023-04-18 02:54

    它自定义函数运行完后有哪些是会保留的,是return里的返回值吗?但它不是只返回了首地址吗?为什么后面的地址不会被回收?

    回复
    语言-逆行者 回复 Asuka y 2023-04-18 03:11

    自定义函数运行完后,其中的局部变量和参数都会被释放,不会保留。如果函数有return语句并返回了一个值,那么这个返回值是会保留的,可以被调用该函数的代码使用。

    当函数返回数组首地址时,实际上传递的也只是数组首地址,而不是整个数组。但是由于在内存中,数组中的元素是按照顺序排列且占用一段连续的空间,因此偏移量加上首地址就可以访问整个数组的元素。这些元素所占用的内存空间只有在程序运行期间才会被回收。

    举个例子,如果在函数中定义了一个数组并返回它的首地址,但是在函数外部没有定义该数组,那么这个数组所占用的内存空间会一直保留,直到程序结束。如果后续代码再次使用了这个数组的地址,就可以继续访问到这个数组的内容。但是需要注意的是,在函数中分配的堆内存空间需要手动释放,否则会导致内存泄漏。

    回复
    展开全部7条评论
查看更多回答(5条)
编辑
预览

报告相同问题?

问题事件

  • 系统已结题 4月25日
  • 已采纳回答 4月18日
  • 修改了问题 4月17日
  • 修改了问题 4月17日
  • 展开全部
手机看
程序员都在用的中文IT技术交流社区

程序员都在用的中文IT技术交流社区

专业的中文 IT 技术社区,与千万技术人共成长

专业的中文 IT 技术社区,与千万技术人共成长

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

客服 返回
顶部