分段故障初始化阵列

时间:2014-02-02 16:12:41

标签: c

以下程序产生分段错误,我不知道为什么。 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

我不明白为什么访问特定索引会导致分段错误。我猜我必须访问进程地址空间之外的内存位置,但如果我从地址空间中成功分配内存,这似乎就是一个错误。

3 个答案:

答案 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));