所以我在C中工作,我在一个函数内部有一个int **
,在另一个函数中被修改。我在运行此问题时遇到了SegFault,因此我决定使用gdb
进行调试。我发现内存从未分配给这个数组。我的功能就像这样
void declarer()
{
int ** a;
alocator(a, 4, 5);
for (int i = 0; i < 4; i++)
for (int j = 0; j < 5; j++)
printf("%d\n", a[i][j]);
}
void alocator(int ** a, int b, int c)
{
a = (int **)malloc(sizeof(int *) * b);
for (int i = 0; i < b; i++) {
a[i] = (int *)malloc(sizeof(int) * c);
for (int j = 0; j < c; j++)
a[i][j] = j;
}
}
当我在行gdb
之后(在程序段错误之前)使用断点运行alocator(a, 4, 5)
时,我写p a
,我得到$1 = (int **) 0x0
,表明a
1}}位于地址0x0
并且没有为其分配内存。为什么alocator
没有为其分配内存,以及如何让alocator
将内存分配给a
?
答案 0 :(得分:2)
因为您按值传递**a
,所以必须将其作为指针传递。所以使用三指针:
void declarer()
{
int **a;
alocator(&a, 4, 5);
...
}
void alocator(int ***a, int b, int c)
{
*a = (int **)malloc(sizeof(int *) * b);
...
答案 1 :(得分:0)
您将变量a
按值传递给函数,因此其值不会被更改。你有两个解决方案:
更改函数以接受类型int ***
的值并按地址传递a
,或将函数的返回值更改为int **
并在调用时使用该值。
示例:
void declarer()
{
int ** a = alocator(4, 5);
for (int i = 0; i < 4; i++)
for (int j = 0; j < 5; j++)
printf("%d\n", a[i][j]);
}
int **alocator(int b, int c)
{
int **a = (int **)malloc(sizeof(int *) * b);
for (int i = 0; i < b; i++) {
a[i] = (int *)malloc(sizeof(int) * c);
for (int j = 0; j < c; j++)
a[i][j] = j;
}
return a;
}