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 是保留空间还是只是将指针返回到起始位置? [复制]的主要内容,如果未能解决你的问题,请参考以下文章