双指针不';t获得malloc';d在功能上

双指针不';t获得malloc';d在功能上,c,gdb,C,Gdb,所以我在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\

所以我在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;
    }
}
void declarer()
{
国际**a;
alocator(a,4,5);
对于(int i=0;i<4;i++)
对于(int j=0;j<5;j++)
printf(“%d\n”,a[i][j]);
}
无效alocator(整数**a、整数b、整数c)
{
a=(int**)malloc(sizeof(int*)*b);
对于(int i=0;i

当我运行
gdb
时,在
alocator(a,4,5)
(在程序segfaults之前)行后面有一个断点,然后我写入
pa
,我得到
$1=(int**)0x0
,这表明
a
在地址
0x0
处,并且没有为它分配内存。为什么
alocator
没有分配内存给它,我怎样才能让
alocator
分配内存给
a

因为你要按值传递
**a
,你必须把它作为指针传递。因此,请使用三重指针:

void declarer()
{
    int **a;
    alocator(&a, 4, 5);
    ...
}

void alocator(int ***a, int b, int c)
{
    *a = (int **)malloc(sizeof(int *) * b);
    ...

因为您要通过值传递
**a
,所以必须将其作为指针传递。因此,请使用三重指针:

void declarer()
{
    int **a;
    alocator(&a, 4, 5);
    ...
}

void alocator(int ***a, int b, int c)
{
    *a = (int **)malloc(sizeof(int *) * b);
    ...

将变量
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;
}
void declarer()
{
int**a=alocator(4,5);
对于(int i=0;i<4;i++)
对于(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);
对于(int i=0;i
通过值将变量
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;
}
void declarer()
{
int**a=alocator(4,5);
对于(int i=0;i<4;i++)
对于(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);
对于(int i=0;i
因为您通过值传递
a
。“双指针”通常是
double*
!因为您通过值传递
a
。“双指针”通常是
double*
!在使用此选项时,我如何分配
a[I]
a[I][j]
?我是否也需要将它们称为
*a[I]
*a[I][j]
。或者
(*a)[i][j]
,我不记得优先顺序。这是
(*a)[i][j]
在使用这个时,我如何分配
a[i]
a[i][j]
?我是否也需要将它们称为
*a[I]
*a[I][j]
。或者
(*a)[i][j]
,我不记得优先顺序。它是
(*a)[i][j]