为什么我将大小为0的空间分配给数组但是我仍然可以写入那段内存?
#include<stdio.h>
int main(int argc, char** argv)
{
int * array = malloc((sizeof(int)) * 0);
int i;
for(i = 0; i < 10; i++)
array[i] = i;
for(i = 0; i < 10; i++)
printf("%d ", array[i]);
}
答案 0 :(得分:6)
当您访问索引越界时,您的代码会调用未定义的行为 -
for(i = 0; i < 10; i++)
array[i] = i;
您不会收到有关此类事情的任何警告或错误,但标准中记录的是 UB 。
在这种情况下,输出可以是任何东西。
对于这一行 -
int * array = malloc((sizeof(int)) * 0);
C标准说 -
如果请求的空间大小为零,则行为是实现定义的:返回空指针,或者行为就像大小是非零值一样,但返回的指针不应用于访问一个对象。
此处它的返回可能是也可能不是NULL pointer
。但很明显,这个指针不应该用于访问任何对象。
答案 1 :(得分:2)
malloc
的 0
会返回NULL
或可以传递给free
的唯一指针。
如果它确实返回一个非空值,并且该指针指向一个页面内的内存,该内存对您的程序有效并且可写,那么如果您尝试编写操作系统,操作系统将不会让您失望它,但你最终可能会重写程序数据的某些部分(=&gt;未定义的行为)。
答案 2 :(得分:0)
C是不安全的语言。作为不安全的语言,它允许您执行以下有风险的操作:
void*
到其他类型,反之亦然)。Unmanaged
。由于这些操作存在风险,可能导致Memory Leak
,Memory Corruption
和其他不需要的结果,因此您应该避免在不需要时执行此类操作,并保持干净和常规代码(使此{{ 1}} 常量并避免使用未分配的内存)。