c-打印在函数中初始化但全局声明的2d数组



我试图打印一个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);来进行函数调用应该可以工作。

相关内容

  • 没有找到相关文章

最新更新