双指针在函数

时间:2016-11-29 19:38:14

标签: 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\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

2 个答案:

答案 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;
}