在c中的循环中添加指向动态指针数组的指针

时间:2012-10-02 19:01:40

标签: c pointers struct malloc

我有一个表示表中一行的结构:

typedef struct {
    char *a;
    char *b;
} row;

我有一个函数,它根据db数据初始化该行并返回指向它的指针

row* get_row(dbrow d) {
    row *r = malloc(sizeof(row));
    r->a = malloc(5);
    strcpy(r->a, d.a);
    r->b = malloc(5);
    strcpy(r->b, d.b);
    return r;
}

最后,我有一个row **rows作为参数的函数:

void get_rows(row **rows) {
    ...
    rows = malloc(rowNumber * sizeof(row*));
    int i;
    for (i = 0; i < rowNumber; i++) {
        rows[i] = get_row(dbrow);
    }
}

get_row按预期工作并返回指向有效行结构的指针,但gdb显示rows [0](以及所有其他行)永远不会获得新值,也就是说,它总是指向同一个地址,几乎就像rows[i] = get_row(dbrow)行不存在。

2 个答案:

答案 0 :(得分:5)

  

... gdb显示行[0](以及所有其他行)永远不会获得新值...

我在这里假设您正在查看get_rows函数的返回值,而不是其局部变量rows的值。这是问题所在:

rows = malloc(rowNumber * sizeof(row*));

您正在为函数接收的原始指针的副本分配新值,而不是原始值。在函数外部不会看到此更改。

如果需要为参数分配新值,则需要添加另一级别的间接。记得; C中的 所有内容 按值传递。所以,你的函数应该以{{1​​}}为参数:

row***

此外,正如user1700513指出的那样,您正在为行分配void get_rows(row ***rows) { if(!rows) { signal_some_error(); return; } ... *rows = malloc(rowNumber * sizeof(row*)); ... } 。这可能不是您的实际代码,因为它会导致编译器错误。

答案 1 :(得分:3)

row r = malloc(sizeof(row));更改为row* r = malloc(sizeof(row));。我想知道你为什么没有得到编译器警告。