2

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

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)行没有不存在。

4

2 回答 2

5

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

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

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

您正在为函数收到的原始指针的副本分配一个新值,而不是原始指针。此更改将在函数之外不可见。

如果您需要为参数分配一个新值,那么您将需要添加另一个间接级别。记住; C 中的所有内容都是按值传递的。所以,你的函数应该把 arow***作为它的参数:

void get_rows(row ***rows) {
    if(!rows) {
        signal_some_error();
        return;
    }
    ...
    *rows = malloc(rowNumber * sizeof(row*));
    ...
}

此外,正如 user1700513 指出的那样,您正在将 a 分配row*给一行。这不可能是您的实际代码,因为它会导致编译器错误。

于 2012-10-02T19:04:23.400 回答
3

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

于 2012-10-02T19:04:50.977 回答