[英]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.