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 求京东批量付款能替代天诚
  • ¥15 slaris 系统断电后,重新开机后一直自动重启
  • ¥15 51寻迹小车定点寻迹
  • ¥15 谁能帮我看看这拒稿理由啥意思啊阿啊
  • ¥15 关于vue2中methods使用call修改this指向的问题
  • ¥15 idea自动补全键位冲突
  • ¥15 请教一下写代码,代码好难
  • ¥15 iis10中如何阻止别人网站重定向到我的网站
  • ¥15 滑块验证码移动速度不一致问题
  • ¥15 Utunbu中vscode下cern root工作台中写的程序root的头文件无法包含