Следующая программа производит ошибку сегментации, и я не уверен, почему. 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
Я не» t понять, почему доступ к определенному индексу вызывает ошибку сегментации. Я могу догадаться, что я должен получить доступ к ячейке памяти вне адресного пространства моих процессов, но это похоже на ошибку, если я успешно выделил память из моего адресного пространства.
Ваш массив 1Mb грубо, но вы пытаетесь получить доступ к элементам за пределами этого. При распределении вы не учитываете размер 'int'. Используйте 'int * arr = malloc (N * sizeof (* arr));' – AntonH