我试图打印一个2d数组,该数组已全局声明为双指针,并在main()
中的函数内部初始化,但我遇到了核心转储错误
我在这里做错了什么?
存储在文件中的数组:
1 2
3 4
5 6
代码:
#include <stdio.h>
#include <stdlib.h>
int** matrix_A = 0;
void initArray ( int** matrixPtr, FILE* matrixFP, int row, int col );
int main ( int argc, char* argv[] )
{
FILE* matrixAfp = fopen ( argv[1], "r" );
int M = atoi ( argv[3] );
int N = atoi ( argv[4] );
initArray ( matrix_A, matrixAfp, 3, 2 );
for ( size_t m = 0; m < M; m++ )
{
for ( size_t n = 0; n < N; n++ )
{
printf ( "%d n", matrix_A[m][n] );
}
}
return 0;
}
void initArray ( int** matrixPtr, FILE* matrixFP, int row, int col )
{
matrixPtr = ( int** ) malloc ( row * sizeof ( int* ) );
for ( size_t m = 0; m < row; m++ )
{
matrixPtr[m] = ( int* ) malloc ( col * sizeof ( int ) );
}
for ( size_t n = 0; n < row; n++ )
{
for ( size_t o = 0; o < col; o++ )
{
fscanf ( matrixFP, "%d", &matrixPtr[n][o] );
}
}
}
问题是,由于按值将matrix_A
传递给函数,因此matrixPtr
实际上是全局matrix_A
的副本,这意味着函数内部的所有更改都发生在matrixPtr
上,而不是全局定义的matrix_A
上。
要解决此问题,您可以通过引用传递:void initArray(int** &matrixPtr, FILE *matrixFP, int row, int col)
除此之外,这个:
int M = atoi(argv[3]);
int N = atoi(argv[4]);
应该是:
int M = atoi(argv[2]);
int N = atoi(argv[3]);
您通过值而不是引用来传递指针,因此无论您在initArray内部使用matrixPtr做什么,在initArray函数之外都不会产生任何影响。尝试按如下方式修改initArray(FILE *matrixFP, int row, int col)
,
int * initArray(FILE *matrixFP, int row, int col){
int m,n,o;
int **matrixPtr = (int **)malloc(row * sizeof(int *));
for (m = 0; m < row; m++) {
matrixPtr[m] = (int *)malloc(col * sizeof(int));
}
for (n = 0; n < row; n++) {
for (o = 0; o < col; o++) {
fscanf(matrixFP, "%d", &matrixPtr[n][o]);
}
}
return matrixPtr;
}
并且在main()
中使用matrix_A=initArray(matrixAfp, 3, 2);
来进行函数调用应该可以工作。