繁体   English   中英

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

[英]why can I write over a piece of memory which has been allocated 0 space?

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

您访问索引越界时代码调用未定义的行为 -

 for(i = 0; i < 10; i++)
 array[i] = i;

您不会收到有关此类事情的任何警告或错误,但这是在UB的标准中记录的。

在这种情况下,输出可以是任何东西。

而对于这一行 -

int * array = malloc((sizeof(int)) * 0);

C标准说 -

如果请求的空间大小为零,则行为是实现定义的:返回空指针,或者行为就像大小是非零值一样,但返回的指针不应用于访问对象。

这里它的返回可能是也可能不是NULL pointer 但很明显,这个指针不应该用于访问任何对象。

参数为0 malloc返回NULL或可以传递给free的唯一指针。 如果它确实返回一个非null值,并且该指针指向一个对你的程序有效并且可写的页面内的内存,那么如果你试图写入它,操作系统将不会摧毁你,但你最终可能会重写一些程序数据的一部分(=>未定义的行为)。

C是一种不安全的语言 作为一种不安全的语言,它允许您执行以下有风险的操作:

  • 写入/读取未分配的内存。
  • 外观铸造类型( void*为其他类型,反之亦然)。
  • 没有绑定检查。
  • 内存Unmanaged
  • 等等...

由于这些操作存在风险并且可能导致Memory LeakMemory Corruption和其他不需要的结果,因此您应该避免在不需要时执行此类操作并保持干净和常规代码(使此10 保持不变并避免处理未分配的内存 )。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM