Структура 2d массива segm ошибка C - PullRequest
0 голосов
/ 02 декабря 2018

Я хочу создать матрицу, содержащую 2 информации в каждой ячейке, поэтому я решил создать двумерную структуру.Более того, я должен динамически распределять память для этой задачи.Когда я запускаю следующий код, программа заканчивается «Ошибка сегментации (ядро выгружено)» .... Я попытался отладить это с помощью printf () и увидел, что все работает, кроме части кода после вызова createMap (R,карта).

Вот мой код:

#include "functions.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct Maps {
    int height;
    int gloves;
};

void read (int *R, int *P) {
    scanf("%d%d", R, P);
}

void createMap (int *R, struct Maps **map) {

    free(map);
    map = calloc (2 * (*R) + 1, sizeof(struct Maps *));
    for (int i = 0; i < 2 * (*R) + 1; ++i) {
    map[i] = calloc (2 * (*R) + 1, sizeof(struct Maps));
    }

    for (int i = 0; i < 2 * (*R) + 1; ++i)
    {
        for (int j = 0; j < 2 * (*R) + 1; ++j)
        {
            map[i][j].height = i + j;
            map[i][j].gloves = i + j;
        }
    }

}

int main () {
    int *R = malloc (sizeof(int));
    int *P = malloc (sizeof(int));
    struct Maps **map = malloc (sizeof(struct Maps *));
    read (R, P);   // work

    createMap (R, map); // kind of executes but there are no data stored  
    printf("%d\n", map[0][0].height);

    free (R);
    free (P);
    return 0;
}

// code on pastebin: https://pastebin.com/v77FbttE

1 Ответ

0 голосов
/ 02 декабря 2018
  1. C использует семантику значений при вызовах функций.Вы передаете карту, но не получаете указатель назад, поэтому на самом деле вы изучаете старую выделенную карту, а не перераспределенную карту.
  2. При вызове функций следует использовать ссылку:int R, P;struct Maps ** map;

    чтение ( & R , & P );

    createMap ( R , & map );

и соответственно определить функции.В createMap - * map = ...

...