Сбой массива заполнения структуры с ошибкой сегментации - PullRequest
0 голосов
/ 16 февраля 2020

Только для справки: я потратил некоторое время, уже проверяя подобные вопросы и безуспешно пробуя их предлагаемые ответы

Я сталкиваюсь с ошибкой "Ошибка сегментации" во время выполнения со следующими C код:

#include <stdio.h>
#include <stdlib.h>

#define ROW_NUM     8
#define COL_NUM     7

typedef struct {
    int matrix[ROW_NUM][COL_NUM];
} screen_type;

typedef struct {
    screen_type *p_screen;
} snake_type;

void fillSnake(snake_type *p_snake);

int main(void) {
    snake_type snake;
    fillSnake(&snake);
    return 0;
}

void fillSnake(snake_type *p_snake) {
    fillWithPointer((screen_type*)p_snake->p_screen);
}

void fillWithPointer(screen_type *p_screen) { //segmentation fault in this method
    for (int col = 0; col < COL_NUM; col++) {
        for (int row = 0; row < ROW_NUM; row++) {
            p_screen->matrix[row][col] = 0;
        }
    }
}

Проблема заключается в заполнении массива методом fillWithPointer. Любые намеки будут более чем приветствоваться.

Ответы [ 2 ]

1 голос
/ 16 февраля 2020

Насколько я понимаю, согласно вашему коду вы должны выполнить mallo c struct snake_type, прежде чем переходить к методу в методе main. snake_type * snake = (snake_type *) mallo c (sizeof (snake_type));

Fillsnake (змея);

1 голос
/ 16 февраля 2020

В вашей функции main, snake никогда не инициализируется, и поэтому его член p_snake остается указателем на какое-то произвольное место в памяти. Затем вы пытаетесь записать в эту память в пределах fillWithPointer, что вам не разрешено, поэтому возникает ошибка сегментации.

Чтобы исправить эту ошибку, выделите часть памяти для snake либо в стеке или куча. Один из способов достижения sh заключается в следующем:

int main(void) {
    screen_type screen = {{{0}}};
    snake_type snake = {&screen};
    fillSnake(&snake);
    return 0;
}

Обратите внимание, что, поскольку экран уже инициализирован нулями, ваши функции fillWithPointer становятся излишними.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...