ghblk 2023-05-31 17:04 采纳率: 85.7%
浏览 41
已结题

关于动态分配内存的问题


 
#include<stdio.h>
#include<stdlib.h>
int* fun(int *a) {
    int *c = (int*)malloc(2 * sizeof(int));
    for (int i = 0; i < 5; i++) {
        c[i] = a[i];
    }
    return c;
}
int main() {
    int a[5] = {1, 2, 3, 4, 5}, *b;
    b = fun(a);
    for (int i = 0; i < 5; i++) {
        printf("%d ", b[i]);
    }
    return 0;
}

我只动态分配了8个字节,应该是只能存2个int的,应该只能返回出2个元素,输出的结果应该是1 2。可是子函数却完整的把数组返回回来了。
malloc函数只分配了8个字节,那8个字节之外的字节应该不在堆区而在栈区,那么这些字节应该随着函数的结束而被释放啊?

img

  • 写回答

4条回答 默认 最新

  • qzjhjxj 2023-05-31 22:11
    关注

    malloc函数动态分配内存,这段内存在堆区,它是由free()手动释放,或是程序结束时由系统回收。malloc函数被调用时,它会沿空闲链表寻找一个可以满足需求的内存块,然后把所需大小的内存块分配给用户,如果申请2个 int 型的空间,存入5个 int 型的元素时,后3个元素的空间会无家可归而直接“住进邻居家”,而对后3个空间赋值就是未定义行为,得到的结果就看运气了,开 始时(内存空间还没有被重新分配)能正常进行,但经过一段时间(内存空间还已经被重新分配)可能会出现问题。可以将代码修改下,多调用几次fun()函数,再输出看看结果。

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

报告相同问题?

问题事件

  • 系统已结题 6月8日
  • 已采纳回答 5月31日
  • 创建了问题 5月31日

悬赏问题

  • ¥15 工价表引用工艺路线,应如何制作py和xml文件
  • ¥15 根据历史数据,推荐问题类型
  • ¥15 需要仿真图,简单的二阶系统实例
  • ¥15 stm32光控照明仿真
  • ¥15 使用人工智能的方法生成满足一定统计参数要求的随机数序列
  • ¥15 SENT协议中相关问题咨询
  • ¥15 URL地址href跳转问题
  • ¥15 mysql数据库备份恢复
  • ¥15 mmdetection mask-rcnn
  • ¥25 matlab可以将微分方程的解显示为相图形式吗