为什么我可以写一个已分配0空间的内存?

时间:2015-09-14 13:50:25

标签: c

为什么我将大小为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]);
}

3 个答案:

答案 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 LeakMemory Corruption和其他不需要的结果,因此您应该避免在不需要时执行此类操作,并保持干净和常规代码(使此{{ 1}} 常量并避免使用未分配的内存)。