我有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。
当我想初始化我的掩码数组时,我总是遇到分段错误...
答案 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>)
,这将给出指针大小而不是实际存储。它将解决错误:)