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

内存空间被收回,存在里面的数据是不是也没有了?(语言-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 22:37
    关注

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

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

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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(5条)

报告相同问题?

问题事件

  • 系统已结题 4月26日
  • 已采纳回答 4月18日
  • 修改了问题 4月17日
  • 修改了问题 4月17日
  • 展开全部

悬赏问题

  • ¥15 linux驱动,linux应用,多线程
  • ¥20 我要一个分身加定位两个功能的安卓app
  • ¥15 基于FOC驱动器,如何实现卡丁车下坡无阻力的遛坡的效果
  • ¥15 IAR程序莫名变量多重定义
  • ¥15 (标签-UDP|关键词-client)
  • ¥15 关于库卡officelite无法与虚拟机通讯的问题
  • ¥15 目标检测项目无法读取视频
  • ¥15 GEO datasets中基因芯片数据仅仅提供了normalized signal如何进行差异分析
  • ¥100 求采集电商背景音乐的方法
  • ¥15 数学建模竞赛求指导帮助