我的2d阵列之一的分段故障(11)?

时间:2017-11-14 14:18:03

标签: c arrays types malloc

我有2个2D数组作为指针。 一个是" int ** field"另一个" char ** mask"。 我想创建2个2D阵列并初始化它们。 代码我用于int数组但不用于char数组,虽然代码是相同的......为什么?

Minesweeper * createField(int n, int m){

    Minesweeper *ms = (Minesweeper *) malloc(sizeof(Minesweeper *));

    ms->m = m;
    ms->n = n;

    ms->field = (int **) malloc(sizeof(int *) * n); 
    ms->mask  = (char **) malloc(sizeof(char *) * n);
    for(int i=0; i<n; i++){
        ms->field[i] = (int *) malloc(sizeof(int *) * m);
        ms->mask[i] = (char *) malloc(sizeof(char *) * m);
    }


    for(int k=0; k<n; k++){
        for(int j=0; j<m; j++){
            ms->field[k][j] = 0;
            ms->mask[k][j] = 'x';
        }
    }

    return ms;
}

顺便说一下:

Minesweeper是一个typedef结构,有4个属性:int ** field,char ** mask,int m和int n。

当我想初始化我的掩码数组时,我总是遇到分段错误...

2 个答案:

答案 0 :(得分:2)

分配时要小心

malloc(sizeof(Minesweeper *));

您获得分配的单个指针的内存 - (Minesweeper *)。要为整个结构分配内存,必须使用sizeof(Minesweeper) - 没有星号。

所以替换为:

Minesweeper *ms = (Minesweeper *) malloc(sizeof(Minesweeper));

ms->field[i] = (int *) malloc(sizeof(int) * m);
ms->mask[i] = (char *) malloc(sizeof(char) * m);

答案 1 :(得分:0)

这里是您可以轻松使用的代码而不是代码:)

Minesweeper * createField(int n, int m){

    Minesweeper *ms = (Minesweeper *) malloc(sizeof(Minesweeper));

    ms->m = m;
    ms->n = n;

    ms->field = (int **) malloc(sizeof(int *) * n); 
    ms->mask  = (char **) malloc(sizeof(char *) * n);
    for(int i=0; i<n; i++){
        ms->field[i] = (int *) malloc(sizeof(int ) * m);
        ms->mask[i] = (char *) malloc(sizeof(char) * m);
    }


    for(int k=0; k<n; k++){
        for(int j=0; j<m; j++){
            ms->field[k][j] = 0;
            ms->mask[k][j] = 'x';
        }
    }

     return ms;
}

malloc声明不正确。 您正在声明一个类型大小的指针,然后您需要写为sizeof(<type>)而不是sizeof(*<type>),这将给出指针大小而不是实际存储。它将解决错误:)

相关问题