Казалось бы, случайный сегфо - PullRequest
1 голос
/ 14 января 2011

Я пытаюсь получить динамический двумерный массив в C.

Всякий раз, когда программа пытается получить доступ к значению в массиве, я проверяю, является ли массив достаточно большим.Если не больше, должно быть выделено место для хранения.Приведенный ниже код проверяет, достаточно ли в массиве столбцов или нет, он перераспределяет новую память.

unsigned long cnt; // y is the element we are trying to access, playfieldsize stores the size of the array
if (y >= playfieldsize.y) { // if the array isn't large enough more data should be allocated
    char **tmp;
    unsigned long cnt;
    cnt = playfieldsize.y; // stores the old size of the array
    playfieldsize.y += (y - playfieldsize.y) + INCREASE; // the new array size
    if (tmp = realloc(playfield, playfieldsize.y * sizeof(char *))) { // if storage can be allocated for the new size
        playfield = tmp;
        for (; cnt<playfieldsize.y; cnt++) { // for every new column a row is added
            char *tmp;
            printf("cnt=%lisize=%li\n", cnt, playfieldsize.y); // added for debugging purpose
            if (tmp = realloc(playfield[cnt], sizeof(char) * playfieldsize.x)) // segfault happens here
                playfield[cnt] = tmp;
            else
                die("Not enough initial memory");
        }
    } else // if storage could not be reallocated
        die("Not enough initial memory");
}

Однако я получаю ошибку сегментации при обращении к массиву с помощью y значение, которое постоянно увеличивается на единицу.Вот что распечатывает программа:

...
cnt=327size=330
cnt=328size=330
cnt=329size=330
cnt=330size=360
cnt=331size=360
Segmentation fault

И я получаю этот segfault, когда я вначале обращаюсь к массиву с несколькими значениями <10 <em>y и затем одним из 301:

...
cnt=27size=30
cnt=28size=30
cnt=29size=30
cnt=30size=330
cnt=31size=330
Segmentation fault

Итак, в первом примере он инициализировал строки до 331, прежде чем произошла ошибка, а во втором - 31. Я не могу понять, что происходит, мне это кажется довольно случайным.

Это вся программа, если необходимо: http://pastebin.com/13mRDh8A

1 Ответ

3 голосов
/ 14 января 2011

Ваш второй realloc (для выделения новых строк) должен быть вместо malloc. В этот момент playfield[cnt] содержит неинициализированные данные, поэтому попытка перераспределения может привести к ошибке.

...