[英]C: passing an array (pointer) to a function
我有一个函数,我想要一个函数来接收2D数组(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));
}
}
您对输出b
论证是错误的。 它必须是一个指向指针的指针(如您如何传递它)。 现在,您应该收到关于此的编译器警告。 函数原型应该是
void count0(int **M,int col, int **a);
然后在功能,你需要使用引用操作来访问a
:
*a = malloc(1*sizeof(int));
请注意,我不malloc
的返回值,没有必要,也不应该。
如您所知,count0函数中矩阵的行数= nline
。 因此,您应该a
为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);
在main()中,在printf语句之后可以显式释放内存。
您正在尝试使用以下变量:
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
(由于&b
是int**
,而a
是int*
,所以现在没有意义)。 你有a
指向新分配的内存,它是在函数后丢失。 我建议的更改将具有*a
,因此具有b
,以指向可以在函数调用后检索的内存。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.