2014-02-02 2 views
3

Следующая программа производит ошибку сегментации, и я не уверен, почему. 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 понять, почему доступ к определенному индексу вызывает ошибку сегментации. Я могу догадаться, что я должен получить доступ к ячейке памяти вне адресного пространства моих процессов, но это похоже на ошибку, если я успешно выделил память из моего адресного пространства.

+2

Ваш массив 1Mb грубо, но вы пытаетесь получить доступ к элементам за пределами этого. При распределении вы не учитываете размер 'int'. Используйте 'int * arr = malloc (N * sizeof (* arr));' – AntonH

ответ

6

malloc(sizeof(int)*N) вместо malloc(N). В противном случае вы получите массив из N байтов, а не N целых чисел.

+0

О, боже, я только что прочитал об этом. Извините, мозг пукает. Спасибо, что указали! –

0

использование

int *arr = (int *) malloc(N * sizeof(int)); 
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)); 
Смежные вопросы