C.分段function修改动态分配的2d数组时的错误

我需要的是一个函数,修改给定指针2d矩阵,如下所示:

void intMatrixAll(int row, int col, int **matrix); 

现在,函数应该分配内存并且可以使用矩阵。 行和列在运行时给出。

 #include  #include  #define PRINTINT(X) printf("%d\n", X); void intMatrixAll(int row, int col, int **matrix); int main(void) { int testArrRow = 4; int testArrCol = 6; int **testMatrix = NULL; intMatrixAll(testArrRow, testArrCol, testMatrix); testMatrix[2][2] = 112; //sementation fault here :( PRINTINT(testMatrix[2][2]); system("PAUSE"); return 0; } void intMatrixAll(int row, int col, int **matrix) { printf("intMatrixAll\n"); //allocate pointers: matrix = malloc(row * sizeof(int *)); if(matrix == NULL) printf("Failed to allocate memmory.\n"); for(int i=0; i<row; i++) { //allocate space for cols: matrix[i] = malloc(col * sizeof(int)); if(matrix[i] == NULL) { printf("Failed to allocate memmory for arr[%d].\n", i); exit(0); } } } 

为什么我会收到错误?

因为在intMatrixAll()中修改矩阵不会修改main()中的testMatrix。 如果你想能够修改main的变量,你需要传递一个指向它的指针。 所以你需要将intMatrixAll更改为:

 void intMatrixAll(int row, int col, int ***matrix) 

在intMatrixAll中,你现在需要将matrix更改为*matrix (当你索引它时,你需要(*matrix)[...]

最后,您需要将对intMatrixAll的调用更改为:

 intMatrixAll(testArrRow, testArrCol, &testMatrix); 

原因是C只支持pass-by-value和pass-by-value不支持被调用函数改变调用者中变量的值。

为了修改调用者中变量的值,您需要传递一个指向该变量的指针,然后让被调用的函数取消引用它。

测试矩阵仍为NULL。 您需要从intMatrixAll()返回新分配的指针。 从函数返回值,或传入testMatrix的地址,以便设置它。

 #include  #include  #define PRINTINT(X) printf("%d\n", X); void intMatrixAll(int row, int col, int **matrix); int main(void) { int testArrRow = 4; int testArrCol = 6; int **testMatrix = NULL; intMatrixAll(testArrRow, testArrCol, &testMatrix); testMatrix[2][2] = 112; //sementation fault here :( PRINTINT(testMatrix[2][2]); system("PAUSE"); return 0; } void intMatrixAll(int row, int col, int ***matrix) { printf("intMatrixAll\n"); //allocate pointers: *matrix = malloc(row * sizeof(int *)); if(*matrix == NULL) printf("Failed to allocate memmory.\n"); for(int i=0; i 

请看这里有关类似的讨论。 它出错的原因是因为你没有将int的指针指针从函数intMatrixAll传递回主程序。 换句话说,你将一个双指针的参数传递给int的 ,而不是通过引用 ,并尝试访问testMatrix ,它实际上仍然是NULL

因此,您需要添加另一级别的间接,即*并使用该间接作为将双指针更改为malloc d的方法,并使主间例看到testMatrix确实已分配。

见上文R. Samuel Klatchko的回答。

作为一般规则,如果要通过引用将指针作为参数传递给某个东西,请添加另一个间接级别。 在您的情况下,您将一个双指针传递给int,将该参数作为函数中的三指针。

 int ** testMatrix;
 void intMatrixAll(int row,int col,int *** matrix){
   //在这里用这个(*矩阵)
 }

 //然后调用函数看起来像这样
 intMatrixAll(testArrRow,testArrCol,&testMatrix); 

 //注意上面的&符号来处理这个通过引用传入的双指针

希望这有助于理解,最好的问候,汤姆。