C:将数组(指针)传递给函数

我有一个函数我想有一个函数来接收一个2D数组(H),读取一个指定的列(col)并将其传递给另一个数组(b)。 看来下面的代码不行,我期待得到1打印。 非常感谢任何指导。

#define nline 5 #define ncol 4 #include  #include  #include  #include  void count0(int **M,int col, int *a); void main(){ int i; int **H; H=(int**)malloc(nline*sizeof(int*)); for(i=0;i<nline;i++){ H[i]=(int*)malloc(ncol*sizeof(int)); } H[0][0]=8; H[0][1]=5; H[0][2]=6; H[0][3]=0; H[1][0]=7; H[1][1]=5; H[1][2]=4; H[1][3]=0; H[2][0]=5; H[2][1]=1; H[2][2]=1; H[2][3]=7; H[3][0]=0; H[3][1]=0; H[3][2]=0; H[3][3]=2; H[4][0]=1; H[4][1]=0; H[4][2]=1; H[4][3]=4; int *b; int col=1; count0(H,col,&b); printf("num 0=%d\n",b[2]); getchar(); } ///////////////////////////////////////////////////////////////////////////////// void count0(int **M,int col, int *a){ int i; a=(int*)malloc(1*sizeof(int)); for(i=0;i<nline;i++){ a[i]=M[i][col]; a=realloc(a,(i+2)*sizeof(int)); } } 

正如您已经知道count0函数中矩阵的行数= nline 。 所以你应该简单地在count函数中为数组a分配所有内存一次,你不需要重新调用realloc()函数。

 void count0(int **M, int col, int** a){ (*a) = malloc(nline * sizeof(int)); for(i = 0; i < nline; i++){ (*a)[i] = M[i][col]; } } 

注意: []优先级高于*所以你需要*a ()*a附近()

只需将此函数称为: count0(H, col, &b);

并且free(b); 在printf语句之后的main()中明确释放内存。

你对输出b论证是错误的。 它需要是指向指针的指针(就像你传递它一样)。 现在你应该得到一个关于它的编译器警告。 函数原型应该是

 void count0(int **M,int col, int **a); 

然后在函数中,您需要使用dereference运算符来访问:

 *a = malloc(1*sizeof(int)); 

请注意,我没有malloc的返回值,没有必要,也不应该。

您正在尝试使用此变量:

 int * b; 

在此调用之后指向新分配的数组:

 count0(H,col,&b); 

为此,您必须将计数0的签名更改为以下内容:

 void count0(int **M,int col, int **a); 

请注意,int * a现在是int ** a。 然后在count0的主体中,您必须使用以下行来分配/重新分配:

 *a=(int*)malloc(1*sizeof(int)); *a=realloc(a,(i+2)*sizeof(int)); 

现在, a是一个只存在于count0范围内的指针变量。 最初它的值是&b (现在它没有意义,因为&b是一个int** ,而a是一个int* )。 你有a新分配的内存点,在函数后丢失。 我建议的更改将有*a ,因此b指向可在函数调用后检索的内存。