Почему это дает ошибку сегментации? - PullRequest
0 голосов
/ 12 января 2011

Я ошеломлен, почему этот код вызывает ошибку сегментации?

#include <stdio.h>

#define LIMIT 1500000

typedef struct {
    int p;
    int a;
    int b;
} triplet;

int main(int argc, char **argv) { 
    int i;
    triplet triplets[LIMIT];

    for (i = 0; i < LIMIT; i++) {
        triplets[i].p = 9; // remove this line and everything works fine
    }

    printf("%d\n", triplets[15].p);

    return 0; 
}

РЕДАКТИРОВАТЬ : После изменения LIMIT на 150 я больше не получаю ошибку сегментации, вместо этого он печатает случайные числа.

EDIT2 : Теперь я знаю, что означает название сайта :) Я сделал массив глобальным, и теперь все работает нормально.

Ответы [ 2 ]

10 голосов
/ 12 января 2011

переполнение стека! Выделение 1500000 записей по 12 байтов на запись (при условии 4 байта int) требует более 17 МБ стекового пространства. Сделайте ваш массив triplets глобальным или выделите его динамически.

Что касается вашего редактирования - сжатие массива, вероятно, остановит переполнение стека, но ваш вызов printf() все равно будет печатать неинициализированные данные - triplets[15].p может быть что угодно во время печати.

4 голосов
/ 12 января 2011

Когда вы делаете

triplet triplets[LIMIT];

, вы выделяете это в стеке.Что, очевидно, слишком велико для вашей системы.

Если вы сделаете

triplet* triplets=(triplet*)malloc(LIMIT*sizeof(triplet));

, вы выделите его в куче, и все должно быть в порядке.Обязательно освободите память, когда закончите с ней

free(triplets);
...