我最近发现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]
的地址,因此它可能被其他数据占用。
答案 0 :(得分:3)
C是一种非常不安全的语言。你通常可以做任何你想做的事情,并且通过做你所做的事情肯定会破坏记忆。通常在简单的程序中你不会注意到这些效果,但很快就会变得明显。
简而言之 - 它是允许但危险的,不应该完成。
用c编程时,你必须在每一行检查自己。
答案 1 :(得分:2)
C不对数组访问进行边界检查,并且尝试读取或写入数组末尾会导致未定义的行为。缓冲区溢出是一种常见的恶意软件攻击。