当我尝试创建结构的二维数组时出现段错误

时间:2018-11-02 15:55:32

标签: c c99

为什么在突出显示的行上出现段错误。我访问2d数组是否错误? tempMap是一个1d数组,具有2d数组的所有值,例如[0,1,0,0,0,0,1,0],由于我知道行数和列数,因此我试图将其放入二维空间数组(这是我的结构)。非常感谢您的帮助。

int opt;
char *filename = NULL;
Space **map;
char *tempMap;

   if (i != 0){
        int col = getCol(filename);
        int row = getRow(filename, col);
        printf("%d x %d\n", row, col);
        map = create_map(row, col, filename);
        tempMap = populate_map(map, filename);
        int curIndx=0;
        for (int l = 0; l < 100; ++l) {
            printf("%c", tempMap[l]);
        }
        for (int j = 0; j < row; ++j) {
            for (int k = 0; k < col; ++k) {
                map[j][k] = makeNewSpace(tempMap[curIndx],row,col); //<-----------This Line
                curIndx++;
            }
        }
    }

这也是makeNewSpace()

Space makeNewSpace(char character, int row, int column){
    Space space;
    space.character = character;
    space.isVisited = false;
    space.row= row;
    space.column = column;
    return space;
}

这是我为2d数组分配空间的地方。

Space **create_map( int row, int col, char *fileName) {
    Space *values = calloc(row * col, 2* sizeof(char) + (4 * sizeof(int)));
    Space **map = malloc(row * sizeof(char *));
    for (int i = 0; i < row; ++i) {
        map[i] = values + i * col;
    }
    return map;
}

最后这是我的结构

typedef struct Space{
    char character;
    bool isVisited;
    int row;
    int column;
}Space;

1 个答案:

答案 0 :(得分:1)

不确定这是否是要使用的,动态分配的二维空间结构数组。

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

// Space struct definition
typedef struct {
    int data;
} Space;

int main() {
    int i;

    // Allocate memory for the rows
    Space** space2d = malloc(sizeof(Space*) * 3);

    // Allocate memory for the columns
    for(i = 0; i < 3; ++i) {
        space2d[i] = malloc(sizeof(Space) * 5);
    }

    // Example setting one of the struct's members inside the 2d array
    space2d[0][0].data = 100;

    printf("%d\n", space2d[0][0].data);

    // Freeing the 2d array
    for(i = 0; i < 3; ++i)
        free(space2d[i]);

    free(space2d);
}