为什么在 C 中访问数组有限制?
Why is there a limit in accessing array in C?
OSX 系统可以很好地从 malloc(return 非 NULL)分配内存。但是,当访问位置传递 1073741823 时,发生了 Segmentation fault: 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
理论上应该不会死在那里
malloc()
函数分配 chars
,sizeof(int)
通常比 1 个字符大得多。
例如;如果您为 2147483647 个字符分配内存,但 sizeof(int)
是“4 个字符”;那么你只为“2147483647/4 = 536870911 ints”分配了足够的内存。
请注意,malloc()
通常会要求操作系统提供更大的内存并将其分成更小的部分。这意味着当您访问未使用 malloc()
分配的内容时,您仍然可以访问 malloc()
向 OS 请求的更大内存量,因此您不会获得页面错误 ("segmentation fault") 一旦你访问了你没有分配的东西(更具体地说,当你尝试访问你没有分配的第 536870912 个 int
时,你不会得到 "segmentation fault" '为).
分配内存
OSX 系统可以很好地从 malloc(return 非 NULL)分配内存。但是,当访问位置传递 1073741823 时,发生了 Segmentation fault: 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
理论上应该不会死在那里
malloc()
函数分配 chars
,sizeof(int)
通常比 1 个字符大得多。
例如;如果您为 2147483647 个字符分配内存,但 sizeof(int)
是“4 个字符”;那么你只为“2147483647/4 = 536870911 ints”分配了足够的内存。
请注意,malloc()
通常会要求操作系统提供更大的内存并将其分成更小的部分。这意味着当您访问未使用 malloc()
分配的内容时,您仍然可以访问 malloc()
向 OS 请求的更大内存量,因此您不会获得页面错误 ("segmentation fault") 一旦你访问了你没有分配的东西(更具体地说,当你尝试访问你没有分配的第 536870912 个 int
时,你不会得到 "segmentation fault" '为).