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