我正在尝试打印一个已全局声明为双指针并在main()
中的函数内初始化的2d数组,但我收到核心转储错误。
我在这里做错了什么?
存储在文件中的数组:
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] );
}
}
}
答案 0 :(得分:2)
问题是,由于您将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]);
答案 1 :(得分:1)
您按值传递指针,而不是通过引用传递,因此无论您在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;
}
使用matrix_A=initArray(matrixAfp, 3, 2);
中的main()
进行函数调用应该可以正常工作。