为什么我的2D数组代码使用malloc(0)?

为什么我的2D数组代码使用malloc(0)?,c,arrays,malloc,C,Arrays,Malloc,我有一个奇怪的问题:我的代码正在工作。具体来说,这是可行的。为什么? char **array = malloc(0); array[0] = malloc(0); strcpy(array[0],"hello"); array[1] = malloc(0); strcpy(array[1],"world"); 到底怎么回事?当我用NULL替换任何malloc或删除它们时 它不起作用,但它似乎并不在乎malloc中的值是多少 非负。取消引用无效指针是未定义的行为;所以任何事情都可能发生。mal

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

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
调用来设置此值


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

如果需要,未定义的行为可以起作用。这个问题似乎是离题的,因为它不太可能在将来帮助其他访问者堆叠溢出。但malloc(1)也会发生同样的情况@CadellChristo使用
malloc(1)
也是未定义的行为,但另一个原因是:您正在写入数组对象的元素。