2010-05-07 147 views
2

好的,所以我有一个二维数组,用来自文件(格式:x y z)的值初始化。
我的文件正确读入值,但是当将z值添加到矩阵/ 2DArray时,我遇到了段错误,我不知道为什么。这可能是不正确的使用指针?我还没有完成他们的任务。初始化二维数组

这是我的初始化器,做工精细,甚至初始化所有“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; 
} 

这是我如何调用初始化器(和解决问题的功能)。

int** map = make2DArray(rows, columns); 
fillMatrix(&map, mapFile); 

这就是问题代码。

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值以及63最大“Y”值,我很确定我没有把订单混淆,所以我不知道该程序为什么是segfault-ing?我敢肯定,这是一个新手的错误...

+0

将阵列构建为阵列阵列会导致性能下降,原因有三。 1:查找一个元素需要两次内存访问(1获取行指针,然后另一个查找行中的值); 2:矩阵元素不是连续存储的,这会损害缓存;和3:它阻止您使用BLAS等高性能矩阵库。 – amaurea 2017-07-29 10:08:04

回答

3

下标比引用操作更高的优先级,所以你需要一对括号:

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

然而,随着你的使用情况,您可以只直接将int**传递给fillMatrix;额外的间接是不必要的。

+0

加上括号仍然给出了段错误,具体的行是我们所指的:* inMatrix [x] [y] = z;然而我不明白为什么它一直添加到y = 46,然后y = 47给出了段错误。 另请注意,make2DArray和fillMatrix方法在名为map.c的文件中,而对它们的调用来自不同的文件。 – FizzBuzz 2010-05-07 03:09:26

+0

@TeeJay:您需要确保测试'sscanf'的返回值以确保它成功,并且您需要检查输入值以确保它们在数组边界内(永远不要信任程序输入)。 – 2010-05-07 03:59:08

+0

我相信我的问题是在矩阵的malloc中。我从i = 0循环到i FizzBuzz 2010-05-07 08:56:45