以下程序产生分段错误,我不知道为什么。 malloc
成功,因此它似乎不是初始化错误,但出于某种原因,当我访问253900个元素时它会出现段错误。该数组只有4 * 1e6字节,或大约一兆字节。
这会产生大量输出
#include <stdlib.h>
#include <stdio.h>
int *long_array(size_t N) {
int *arr = (int *) malloc(N);
if (arr == NULL) { printf("could not malloc"); exit(1); }
for (size_t i = 0; i < N; i++) {
printf(".. %ld ", i);
arr[i] = 10;
}
printf("done with loop\n");
return arr;
}
int main(void) {
int *arr = long_array(1000000);
printf("%d", arr[5050]);
return 0;
}
我用gcc -std=c99
编译它并运行输出以查看在segfault之前打印的最后几个数字:
253899 .. 253900 .. 2
segmentation fault (core dumped) ./a.out
我不明白为什么访问特定索引会导致分段错误。我猜我必须访问进程地址空间之外的内存位置,但如果我从地址空间中成功分配内存,这似乎就是一个错误。
答案 0 :(得分:6)
malloc(sizeof(int)*N)
代替malloc(N)
。
否则你会得到一个N个字节的数组,而不是N个整数。
答案 1 :(得分:0)
使用
int *arr = (int *) malloc(N * sizeof(int));
答案 2 :(得分:0)
您的代码是正确的,但问题是您没有考虑整数的大小 在分配内存的同时。你刚刚分配了:
int *arr=(int *)malloc(N);
这里你刚刚分配了N的大小,但你必须考虑机器中整数的大小。 如果你只分配10000000大小的内存和sizeof(int)你的机器是4那么它只能访问(10000000/4)内存......... 所以你必须分配内存,如:
int *arr=(int *)malloc(N*sizeof(int))
或
int *arr=(int *)malloc(N*sizeof(*arr));