簡體   English   中英

C:將數組(指針)傳遞給函數

[英]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 (由於&bint** ,而aint* ,所以現在沒有意義)。 你有a指向新分配的內存,它是在函數后丟失。 我建議的更改將具有*a ,因此具有b ,以指向可以在函數調用后檢索的內存。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM