当我将双指针传递给函数以初始化内存
时,我遇到了分段错误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;
}
}
}
如何将双指针传递给函数.....
答案 0 :(得分:17)
如果要修改指针指针,则需要将指针传递给指向指针。
void func(double ***data) { *data = malloc(sizeof(double*)*10); for.... };
double ** data; func(&data);
答案 1 :(得分:17)
就像其他人所说的那样,你需要在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
函数的本地副本,因此当你返回时它会丢失。
答案 2 :(得分:1)
一方面,A
内部初始化是A
中main
的副本 - 所以当你回到main
时,它的{{1}仍未初始化。如果你尝试使用它 - 繁荣!
要通过引用将其传递给A
,您需要将参数类型更改为initialize
并传入double***
中的&A
。然后,当您在main
中使用它时,您需要每次取消引用它,即initialize
。
答案 3 :(得分:1)
您没有检查内存不足错误。失败。
您将未初始化的值A传递给BY VALUE以初始化(),然后将其初始化。但是回到main(),那个局部变量A仍然没有初始化。相反,您可能有initialize()返回double**
(例如A = initialize(...)
)或修改initialize(),因此其第一个形式参数是double ***pA
,您使用*pA = (double**)malloc(...);
初始化
答案 4 :(得分:1)
这是你不想做的事情。而不是为此不必要地使用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;
}