C 我的一个2d阵列出现分段错误(11)?
我有2个2D数组作为指针。 一个是“int**field”,另一个是“char**mask”。 我想创建2个二维数组并初始化它们。 我的代码适用于int数组,但不适用于char数组,尽管代码是相同的。。。为什么?C 我的一个2d阵列出现分段错误(11)?,c,arrays,types,malloc,C,Arrays,Types,Malloc,我有2个2D数组作为指针。 一个是“int**field”,另一个是“char**mask”。 我想创建2个二维数组并初始化它们。 我的代码适用于int数组,但不适用于char数组,尽管代码是相同的。。。为什么? Minesweeper * createField(int n, int m){ Minesweeper *ms = (Minesweeper *) malloc(sizeof(Minesweeper *)); ms->m = m; ms->n
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;
}
扫雷舰*createField(int n,int m){
扫雷舰*ms=(扫雷舰*)malloc(扫雷舰*);
ms->m=m;
ms->n=n;
ms->field=(int**)malloc(sizeof(int*)*n);
ms->mask=(char**)malloc(sizeof(char*)*n);
对于(int i=0;i字段[i]=(int*)malloc(sizeof(int*))*m);
ms->mask[i]=(char*)malloc(sizeof(char*)*m);
}
对于(int k=0;kmask[k][j]='x';
}
}
返回ms;
}
顺便说一下:
扫雷舰是一个typedef结构,有4个属性:int**field、char**mask、int m和int n
当我想初始化我的掩码数组时,我总是会遇到分段错误…当你像这样分配时要小心
malloc(sizeof(Minesweeper *));
您可以为单个指针分配内存-(扫雷舰*)
。要为整个结构分配内存,您必须使用sizeof(扫雷舰)
-不带星号
因此,替换为:
Minesweeper *ms = (Minesweeper *) malloc(sizeof(Minesweeper));
及
以下是您可以轻松使用的内容,而不是您的代码:)
扫雷舰*createField(int n,int m){
扫雷舰*ms=(扫雷舰*)malloc(扫雷舰);
ms->m=m;
ms->n=n;
ms->field=(int**)malloc(sizeof(int*)*n);
ms->mask=(char**)malloc(sizeof(char*)*n);
对于(int i=0;i字段[i]=(int*)malloc(sizeof(int)*m);
ms->mask[i]=(char*)malloc(sizeof(char)*m);
}
对于(int k=0;kmask[k][j]='x';
}
}
返回ms;
}
malloc声明不正确。
如果要声明一个大小为某个类型的指针,则需要以
sizeof()
而不是sizeof(*)
的形式写入,这将给出指针的大小,而不是实际的存储。如果您通常将malloc的结果强制转换为sizeof()中提供的类型的指针,这将解决以下错误:)参数,则编译器将非常可靠地显示您分配给的类型是否与您分配给的类型匹配。这些警告可以避免您在调试时遇到困难。@Ctx但当您忘记包含stdlib.h
头时,强制转换将隐藏错误:malloc()将隐式声明为返回<代码> int <代码>,立即到达乌布。当您尝试用C++编译器编译C代码时,只需要这些转换。因此,当您在编程C时,最好使用这个<代码> Fo*Foo= Maloc(siZoof(*FoO))。;
,它避免了任何类型不匹配的可能性。@Ctx不过,问题仍然是强制转换在C中是纯噪声。@Ctx强制转换只会重复与您指定的指针变量类型中已找到的完全相同的信息。在该指定之前,内存只是一块未初始化内存的非类型化板,带有一个关键的部分不是要转换成正确的类型,而是在int x=foo();
时,我也不会添加强制转换,不是吗?
ms->field[i] = (int *) malloc(sizeof(int) * m);
ms->mask[i] = (char *) malloc(sizeof(char) * m);
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;
}