在C中写入数组的末尾

时间:2016-10-22 13:20:55

标签: c arrays pointer-arithmetic

我最近发现C允许我进行以下操作:

char* myArray[1];

myArray[0] = malloc(1024 * sizeof(char));
strcpy(myArray[0], "Hello");

myArray[1] = malloc(1024 * sizeof(char));
strcpy(myArray[1], "World");

//repeat ad absurdum

有效地允许我尽可能多地填充myArray指向数据的指针,尽管它只是初始化地为一个指针请求内存。

为什么允许这样做? 这被认为是好的做法还是会导致不可预见的后果? 根据我的理解,数组的不同索引在内存中彼此相邻地分配,并且由于在初始化数组时从未显式请求myArray[1]的地址,因此它可能被其他数据占用。

2 个答案:

答案 0 :(得分:3)

C是一种非常不安全的语言。你通常可以做任何你想做的事情,并且通过做你所做的事情肯定会破坏记忆。通常在简单的程序中你不会注意到这些效果,但很快就会变得明显。

简而言之 - 它是允许但危险的,不应该完成。

用c编程时,你必须在每一行检查自己。

答案 1 :(得分:2)

C不对数组访问进行边界检查,并且尝试读取或写入数组末尾会导致未定义的行为。缓冲区溢出是一种常见的恶意软件攻击。