我有一个奇怪的问题:我的代码正在运行。具体来说,这是有效的。为什么?
char **array = malloc(0);
array[0] = malloc(0);
strcpy(array[0],"hello");
array[1] = malloc(0);
strcpy(array[1],"world");
这到底是怎么回事?当我用 NULL 替换任何 malloc 或删除它们时,它不起作用,但 malloc 内部的值似乎并不重要,因为它不是负数。
取消引用无效指针是未定义的行为;所以任何事情都可能发生。
malloc(0)
是实现定义的,并返回空指针或无效指针。
您正在通过使用返回的指针调用未定义的行为malloc(0)
。
除了malloc(0)
. 由于对齐原因,Malloc 实现通常对分配的块具有最小粒度。这意味着任何块的大小始终至少为 4、8、12、16 字节,具体取决于实现。如果我没记错的话,你甚至可以mallopt
在某些平台上通过调用来设置这个值。
另一件事是,分配代码中的缓冲区溢出通常只会在您尝试释放指针时崩溃,因为只有这样您的块周围的内存才会用于库使用的内部簿记。这就是为什么缓冲区溢出如此难以捕捉的原因之一,它们出现在不同的位置和时间,然后是它们发生的时间。