C: передача массива (указатель) в функцию

У меня есть функция, которую я хотел бы получить, чтобы получить 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));
    }
}

Ответ 1

Как вы уже знаете количество строк = nline в вашей матрице в функции count0. Поэтому вам нужно просто выделить всю память для массива 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); в main() после инструкции printf, чтобы освободить память явно.

Ответ 2

Ваш аргумент для вывода b неверен. Он должен быть указателем на указатель (например, как вы его передаете). Прямо сейчас вы должны получить предупреждение компилятора об этом. Прототип функции должен быть

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

Затем в функции вам нужно использовать оператор разыменования для доступа к a:

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

Обратите внимание, что я не выдаю возвращаемое значение malloc, вам не нужно и не нужно.

Ответ 3

Вы пытаетесь получить эту переменную:

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, указать на память, которая может быть восстановлена ​​после вызова функции.