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