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