C 初始化二维数组
好的,我有一个2D数组,它是用文件中的值初始化的(格式:xyz)。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*))
我的文件正确地读入了值,但是当将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;