尝试分配N个元素的char数组。
#include <stdio.h>
#include <malloc.h>
int main()
{
int N = 2;
char *array = malloc(N * sizeof(char));
array[0] = 'a';
array[1] = 'b';
array[2] = 'c'; // why can i do that??
printf("%c", array[0]);
printf("%c", array[1]);
printf("%c", array[2]); //shouldn't I get a seg fault here??
return 0;
}
问题是:
因为我分配了2 * 1 = 2个字节的内存,这意味着我的数组中可以有2个字符。怎么可能我有更多?我还打印了sizeof(* array),它打印了8个字节。我在这里缺少什么?
答案 0 :(得分:2)
当程序试图访问尚未由操作系统映射到其虚拟内存地址空间的内存地址时,会发生分段错误。
内存分配发生在页面中(通常为4k或8k,但您也可以获得更大的页面)。因此,malloc()调用从操作系统获取一个内存页面,并为该数组创建一部分并返回指向该数组的指针。在这个特定的情况下,在你的数组之后仍然有一大块页面剩余(未分配但已经可用于后续调用malloc()) - array [2]引用页面内的有效地址,因此没有分段错误
但是,您正在访问数组之外的内存并且如注释中所述,这是未定义的行为,并且可能通过覆盖不相关变量的值而导致更大程序中的内存损坏。
答案 1 :(得分:0)
第0个和第1个元素在有效内存分配范围内。使用第2个元素,你已经侵入了未分配的内存。工作正常,直到内存的那部分被分配给其他东西,然后你的第2个元素将开始具有疯狂的价值。你的代码将疯狂。但正如@jon指出的那样,编译器应该会捕获它,除非你要求它关闭