C: передача массива (указателя) в функцию
У меня есть функция, я хотел бы иметь функцию для получения двумерного массива (H), чтобы прочитать указанный столбец (столбец) и передать его в другой массив (б). Похоже, что приведенный ниже код не в порядке, если я ожидал получить 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));
}
}
3 ответа
Как вы уже знаете количество строк = nline
в вашей матрице в функции count0. Таким образом, вы должны просто выделить всю память для массива a
в функции count один раз вам не нужно повторно вызывать функцию 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 для явного освобождения памяти.
Ваш аргумент для вывода b
неправильно. Это должен быть указатель на указатель (например, как вы его передаете). Прямо сейчас вы должны получить предупреждение компилятора об этом. Прототип функции должен быть
void count0(int **M,int col, int **a);
Затем в функции вам нужно использовать оператор разыменования для доступа a
:
*a = malloc(1*sizeof(int));
Обратите внимание, что я не разыгрываю возвращаемое значение malloc
Нет необходимости и не нужно.
Вы пытаетесь получить эту переменную:
int * b;
Укажите на вновь выделенный массив после этого вызова:
count0(H,col,&b);
Для этого необходимо изменить подпись счетчика 0 на следующую:
void count0(int **M,int col, int **a);
Обратите внимание, что int *a теперь является int **a. Затем в теле count 0 вы должны использовать следующие строки для выделения / перераспределения a:
*a=(int*)malloc(1*sizeof(int));
*a=realloc(a,(i+2)*sizeof(int));
Прямо сейчас, a
переменная-указатель, которая существует только в области видимости count0
, Первоначально его значение &b
(который сейчас не имеет смысла, так как &b
является int**
, а также a
является int*
). У тебя есть a
указать на вновь выделенную память, которая теряется после функции. Предлагаемые изменения будут иметь *a
, и поэтому b
, чтобы указать на память, которую можно получить после вызова функции.