OSX系统可以从malloc分配内存(返回非NULL(。 但是,当访问仓位传递1073741823时,发生了分割错误:11。 谁能教育我原因?
我可以访问下面的任何点1073741824很好(如代码所示(。我确实尝试访问高于1073741824点的随机位置,结果仍然是相同的错误,而低于1073741824的任何随机访问都可以正常工作。
void dead(){
size_t pos = 0;
size_t max =2147483647;
max *= 2;
printf("%ldn",max);
int* data = malloc(max);
if(data == NULL){exit(1);}
pos = 2147483647/2;
pos-=3;
for (; pos < 2147483647; pos++) {
printf("%ldn",pos);
data[pos] = 10;
printf("%in",data[pos]);
}
}
4294967294
1073741820
10
1073741821
10
1073741822
10
1073741823
10
1073741824
Segmentation fault: 11
从理论上讲,它不应在那里。
malloc()
函数分配chars
,sizeof(int)
通常远大于 1 个字符。
例如,如果您为2147483647个字符分配内存,但sizeof(int)
是"4 个字符";那么您只为"2147483647/4 = 536870911 ints"分配了足够的内存。
请注意,malloc()
通常会要求操作系统提供更大的内存量,并将其拆分为较小的部分。这意味着,当您访问未分配malloc()
的内容时,您仍然可以访问malloc()
要求操作系统提供的大量内存,因此一旦您访问未分配的内容,您就不会立即收到页面错误("分段错误"((更具体地说,一旦您尝试访问未为其分配内存的第 536870912 int
,您就不会收到"分段错误"(。