在 C 中写入超出数组末尾的内容
Writing beyond the end of an array in C
我最近发现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]
的地址,因此它可能被其他数据占用。
C 是一种非常不安全的语言。你通常可以做任何你想做的事,而且做你做过的事肯定会毁了记忆。通常在简单的程序中您不会注意到效果,但它很快就会变得明显。
简而言之 - 这是允许的,但很危险,不应该这样做。
用c编程时,每行都要检查自己。
C 不会对数组访问进行边界检查,并且尝试读取或写入超出数组末尾的内容会导致未定义的行为。缓冲区溢出是一种常见的恶意软件攻击。
我最近发现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]
的地址,因此它可能被其他数据占用。
C 是一种非常不安全的语言。你通常可以做任何你想做的事,而且做你做过的事肯定会毁了记忆。通常在简单的程序中您不会注意到效果,但它很快就会变得明显。
简而言之 - 这是允许的,但很危险,不应该这样做。
用c编程时,每行都要检查自己。
C 不会对数组访问进行边界检查,并且尝试读取或写入超出数组末尾的内容会导致未定义的行为。缓冲区溢出是一种常见的恶意软件攻击。