Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 我的一个2d阵列出现分段错误(11)?_C_Arrays_Types_Malloc - Fatal编程技术网

C 我的一个2d阵列出现分段错误(11)?

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

我有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 = 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强制转换只会重复与您指定的指针变量类型中已找到的完全相同的信息。在该指定之前,内存只是一块未初始化内存的非类型化板,带有一个关键的部分不是要转换成正确的类型,而是在 MalCube()/Cux>参数中使用正确的长度。您正在从一个纯C++思维模式接近:您认为与新的< /代码>类似,它产生了一个完全初始化的对象,在这个对象上构造函数已经运行。实际上只是返回内存,而不是对象。@Ctx我不知道,你对我的看法有多虔诚,我尽量不去做……无论如何,我很难理解你的论点:每当我编码时,我都会尝试一次将所有东西都编码。如果我需要几次,我很可能只给它一个描述性的名称,然后重新使用这个名称。我需要什么绝对不要为了冗余而添加冗余。永远不要。在我看来,这只会增加我需要解析的代码量,并且可能包含错误。我会将这称为违反DRY和KISS。当我编写
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;
}