Ответ 1
Если вы хотите изменить указатель на указатель, вам нужно передать указатель на указатель на указатель.
void func(double ***data) { *data = malloc(sizeof(double*)*10); for.... };
double ** data; func(&data);
Я получаю ошибку сегментации, когда передаю двойные указатели на функцию для инициализации памяти
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;
}
}
}
Как передать двойные указатели на функции.....
Если вы хотите изменить указатель на указатель, вам нужно передать указатель на указатель на указатель.
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 является копией A
в main
- поэтому, когда вы вернетесь к main
, ее A
по-прежнему не инициализируется. Если вы попытаетесь использовать его - стрела!
Чтобы передать его в initialize
'по ссылке', вам необходимо изменить тип параметра на double***
и передать &A
в main
. Затем, когда вы используете его в initialize
, вам нужно разыгрывать его каждый раз, т.е. *A
.
Вы не проверяете наличие ошибок в памяти. Сбой.
Вы передаете BY VALUE неинициализированное значение A для инициализации(), а затем инициализируете это. Но вернемся в main(), что локальная переменная A все еще не инициализирована. Вместо этого вы можете инициализировать() вернуть double**
(например, A = initialize(...)
) или изменить 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;
}