【问题标题】:does malloc reserve the space or just return the pointer to starting location? [duplicate]malloc 是保留空间还是只是将指针返回到起始位置? [复制]
【发布时间】:2022-01-20 03:42:03
【问题描述】:

我知道 malloc(n) 返回一个指向 n 字节内存的指针。假设我想要 5 个字节的内存并初始化为整数数组(我知道分配的字节数不足)。

int *a = malloc(5);
*a = 1234;
*(a+1) = 5000;

printf("%d ",*a);
printf("%d",*(a+1));

据我所知,前四个字节由1234 使用,第二个元素应该只剩下一个字节。但是,输出是1234 5000。第二个元素如何获取剩余的 3 个字节?

稍后如果我通过free(a) 取消初始化数组,它会释放第二个元素的额外字节吗?

【问题讨论】:

  • 你已经分配了五个字节。假设int 是四个字节,你总共写了八个字节。这超出了分配内存的范围,并且正如在其他地方提到的那样导致未定义的行为。作为程序员,您有责任确保您的程序没有未定义的行为。
  • 内存管理器分配的内存可能是块大小,以保证任何对象的对齐。因此,例如,实际保留的内存可能是 8 个字节,但只能保证请求的 5 个。或者也许内存管理器以 16 字节的段落处理内存。
  • 您是否尝试释放内存?一些分配器会在分配的块之后放置一些魔法字节,如果您释放了一些混乱的内存,则会抱怨。

标签: c malloc


【解决方案1】:

malloc 是保留空间还是只返回指向起始位置的指针?

malloc() 确实保留了空间并希望代码尊重分配的空间。如果您尝试访问更多内容,则只能靠自己。

第二个元素如何获得剩余的 3 个字节?

未定义的行为 (UB)。任何事情都可能发生。其余代码无关紧要——也许吧。

【讨论】:

    【解决方案2】:

    您使用*(a+1)=“覆盖”恰好位于分配字节之后的字节。这些字节不属于你。
    你很幸运它没有崩溃,因为这是未定义的行为。

    【讨论】:

      【解决方案3】:

      编译器可以根据需要优化代码,而不必逐字执行所编写的内容。只需产生预期的结果。

      因此,在我的机器上,编译器会删除不必要的读写并将代码转换为

      nt *a = malloc(5);
      
      printf("%d ",1234);
      printf("%d",5000);
      

      突然什么都没有被覆盖!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-03-22
        • 2022-11-10
        • 2021-11-13
        • 1970-01-01
        • 2011-08-16
        • 2023-03-12
        • 1970-01-01
        相关资源
        最近更新 更多