C: как передать двойной указатель на функцию
Я получаю ошибку сегментации, когда я передаю двойные указатели на функцию для инициализации памяти
int main()
{
double **A;
initialize(A, 10, 10);
......
}
void initialize(double **A, int r, int c)
{
A = (double **)malloc(sizeof(double *)*r);
for(int i = 0; i< r; i++) {
A[i] = (double *)malloc(sizeof(double) *c);
for(int j = 0; j < c; j++) {
A[i][j] = 0.0;
}
}
}
Как я могу передать двойные указатели на функции.....
5 ответов
Если вы хотите изменить указатель на указатель, вы должны передать указатель на указатель на указатель.
void func(double ***data) { *data = malloc(sizeof(double*)*10); for.... };
double ** data; func(&data);
как уже говорили другие, вы должны принимать указатель на указатель на указатель в функцию init. Вот как initialize
изменения функции:
void initialize(double ***A, int r, int c)
{
*A = (double **)malloc(sizeof(double *)*r);
for(int i = 0; i< r; i++) {
(*A)[i] = (double *)malloc(sizeof(double) *c);
for(int j = 0; j < c; j++) {
(*A)[i][j] = 0.0;
}
}
}
и main
будет:
int main()
{
double **A;
initialize(&A, 10, 10);
}
кроме того, код, как вы его разместили, не должен вызывать ошибки сегментации при передаче A
указатель. Ошибка сегментации, скорее всего, возникает, когда вы возвращаетесь из функции и пытаетесь получить доступ A
, потому что A
на main
не будет инициализированный. Только копия инициализируется так, как вы это делаете, и эта копия локальна для initialize
функция, поэтому она теряется, когда вы возвращаетесь.
Ну во-первых,A
внутри initialize находится копия A
на main
-- Итак, когда вы вернетесь в main
, его A
еще не инициализирован. Если вы попытаетесь использовать его-бум!
передать initialize
'по ссылке', вам нужно изменить тип параметра на double***
и передать &A
на main
. Затем, когда вы используете его в initialize
, вы должны разыменовать его каждый раз, т. е. *A
.
вы не проверяете наличие ошибок в памяти. Неудача.
вы передаете по значению неинициализированное значение A для инициализации (), а затем инициализируете это. Но вернемся к main(), что локальная переменная A по-прежнему неинициализирована. Вместо этого вы могли бы инициализировать() возвращает
double**
(например,A = initialize(...)
) или modify initialize (), поэтому его первым формальным параметром являетсяdouble ***pA
инициализации с*pA = (double**)malloc(...);
Это то, что вы не хотите делать. Вместо ненужного использования аргумента out для этого выделите функцию и верните результат. Вместо этого:
int main()
{
double **A;
A = initialize(A10, 10);
}
double** initialize(int r, int c)
{
double **A;
A = malloc(sizeof(double *)*r);
for(int i = 0; i< r; i++) {
A[i] = (double *)malloc(sizeof(double) *c);
for(int j = 0; j < c; j++) {
A[i][j] = 0.0;
}
}
return A;
}