malloc 是保留空间还是只是将指针返回到起始位置? [复制]

Posted

技术标签:

【中文标题】malloc 是保留空间还是只是将指针返回到起始位置? [复制]【英文标题】:does malloc reserve the space or just return the pointer to starting location? [duplicate] 【发布时间】: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 字节的段落处理内存。 您是否尝试释放内存?一些分配器会在分配的块之后放置一些魔法字节,如果您释放了一些混乱的内存,则会抱怨。 【参考方案1】:

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

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

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

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

【讨论】:

【参考方案2】:

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

【讨论】:

【参考方案3】:

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

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

nt *a = malloc(5);

printf("%d ",1234);
printf("%d",5000);

突然什么都没有被覆盖!

【讨论】:

以上是关于malloc 是保留空间还是只是将指针返回到起始位置? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

malloc函数

内存动态分配与释放

malloc用法整理

malloc/free函数

动态内存分配函数

quiz 3