2

我有一个奇怪的问题:我的代码正在运行。具体来说,这是有效的。为什么?

char **array = malloc(0);
array[0] = malloc(0);
strcpy(array[0],"hello");
array[1] = malloc(0);
strcpy(array[1],"world");

这到底是怎么回事?当我用 NULL 替换任何 malloc 或删除它们时,它不起作用,但 malloc 内部的值似乎并不重要,因为它不是负数。

4

3 回答 3

1

取消引用无效指针是未定义的行为;所以任何事情都可能发生。

于 2012-10-28T11:05:11.033 回答
1

malloc(0)是实现定义的,并返回空指针或无效指针。

您正在通过使用返回的指针调用未定义的行为malloc(0)

于 2012-10-28T11:05:25.760 回答
0

除了malloc(0). 由于对齐原因,Malloc 实现通常对分配的块具有最小粒度。这意味着任何块的大小始终至少为 4、8、12、16 字节,具体取决于实现。如果我没记错的话,你甚至可以mallopt在某些平台上通过调用来设置这个值。

另一件事是,分配代码中的缓冲区溢出通常只会在您尝试释放指针时崩溃,因为只有这样您的块周围的内存才会用于库使用的内部簿记。这就是为什么缓冲区溢出如此难以捕捉的原因之一,它们出现在不同的位置和时间,然后是它们发生的时间。

于 2012-10-28T11:46:56.503 回答