【发布时间】: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 字节的段落处理内存。
-
您是否尝试释放内存?一些分配器会在分配的块之后放置一些魔法字节,如果您释放了一些混乱的内存,则会抱怨。