Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.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 初始化二维数组_C_Multidimensional Array - Fatal编程技术网

C 初始化二维数组

C 初始化二维数组,c,multidimensional-array,C,Multidimensional Array,好的,我有一个2D数组,它是用文件中的值初始化的(格式:xyz)。 我的文件正确地读入了值,但是当将z值添加到矩阵/2DArray时,我遇到了segfault,我不知道为什么。可能是指针的使用不正确?我还不太懂它们的窍门 这是我的初始化器,工作正常,甚至将所有“z”值初始化为0 int** make2DArray(int rows, int columns) { int** newArray; newArray = (int**)malloc(rows*sizeof(int*))

好的,我有一个2D数组,它是用文件中的值初始化的(格式:xyz)。
我的文件正确地读入了值,但是当将z值添加到矩阵/2DArray时,我遇到了segfault,我不知道为什么。可能是指针的使用不正确?我还不太懂它们的窍门

这是我的初始化器,工作正常,甚至将所有“z”值初始化为0

int** make2DArray(int rows, int columns)
{
    int** newArray;
    newArray = (int**)malloc(rows*sizeof(int*));
    if (newArray == NULL)
    {
        printf("out of memory for newArray.\n");
    }
    for (int i = 0; i < rows; i++)
    {
        newArray[i] = (int*)malloc(columns*sizeof(int));
        if (newArray[i] == NULL)
        {
            printf("out of memory for newArray[%d].\n", i);
        }
    }

    //intialise all values to 0
    for (int i = 0; i < rows; i++)
    {
        for (int j = 0; j < columns; j++)
        {
            newArray[i][j] = 0;
        }
    }

    return newArray;
}
这就是问题代码

void fillMatrix(int*** inMatrix, FILE* inFile)
{
    int x, y, z;
    char line[100];
    while(fgets(line, sizeof(line), inFile) != NULL)
 {
  sscanf(line, "%d %d %d", &x, &y, &z);
  *inMatrix[x][y] = z;
 }
}
根据我通过使用ddd得到的信息,当y达到47时,问题就出现了。

映射文件的最大“x”值为47,最大“y”值为63,我很确定我没有混淆顺序,所以我不知道程序为什么要分段?我确信这是一些新手的错误…

下标的优先级高于取消引用运算符,因此需要一对括号:

(*inMatrix)[x][y] = z;

然而,对于您的用例,您可以直接将
int**
传递到
fillMatrix
;额外的间接性是不必要的。

添加括号仍然会产生segfault,具体的行就是我们所指的:*inMatrix[x][y]=z;然而,我不明白为什么它加上罚款一直到y=46,然后y=47给出一个segfault。还要注意,make2DArray和fillMatrix方法位于一个名为map.c的文件中,而对它们的调用来自另一个文件。@TeeJay:您需要确保测试
sscanf
的返回值以确保它成功,并且需要检查输入值以确保它们在数组的范围内(永远不要相信程序输入)。我相信我的问题在于矩阵的malloc。我从I=0循环到I<行,但随后访问最多行,因此访问超出范围。将矩阵构建为数组数组将导致性能不佳,原因有三。1:查找元素需要两次内存访问(1:获取行指针,然后另一个用于查找行中的值);2:矩阵元素不是连续存储的,这会损害缓存;3:它阻止您使用BLAS之类的高性能矩阵库。
(*inMatrix)[x][y] = z;