分段故障初始化阵列

dun*_*cks 3 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;
}
Run Code Online (Sandbox Code Playgroud)

我编译它gcc -std=c99并运行输出以查看在segfault之前打印的最后几个数字:

253899 .. 253900 .. 2
segmentation fault (core dumped)  ./a.out
Run Code Online (Sandbox Code Playgroud)

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

Mos*_*ieb 6

malloc(sizeof(int)*N)而不是malloc(N).否则你会得到一个N个字节的数组,而不是N个整数.