[英]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 Leak
, Memory Corruption
和其他不需要的结果,因此您应该避免在不需要时执行此类操作并保持干净和常规代码(使此10
保持不变并避免处理未分配的内存 )。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.