0

我有一个函数我想要一个函数来接收二维数组(H),读取指定的列(col)并将其传递给另一个数组(b)。如果我期望打印 1,下面的代码似乎不行。非常感谢任何指导。

#define nline 5
#define ncol 4

#include <string.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>

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));
    }
}
4

3 回答 3

2

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

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

然后在函数中你需要使用解引用操作符来访问a

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

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

于 2013-07-30T16:38:56.620 回答
1

nline正如您已经知道count0 函数中矩阵中的行数 = 一样。所以你应该简单地为 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

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

free(b);在 printf 语句之后的 main() 中显式地释放内存。

于 2013-07-30T16:32:58.770 回答
0

您正在尝试使用此变量:

int * b;

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

count0(H,col,&b); 

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

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

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

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

现在,a是一个指针变量,只存在于count0. 最初它的值是&b(现在没有意义,因为&bis anint**ais an int*)。您已经a指向新分配的内存,该内存在函数之后丢失。我建议的更改将具有*a,因此b,指向可以在函数调用后检索的内存。

于 2013-07-30T16:43:28.763 回答