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); //注意上面的&符号来处理这个通过引用传入的双指针
希望这有助于理解,最好的问候,汤姆。