>我有一个结构来表示表中的一行:
typedef struct {
char *a;
char *b;
} row;
我有一个函数,它根据数据库数据初始化该行并返回指向它的指针
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 显示行 [0](以及所有其他行)永远不会获得新值,也就是说,它总是指向相同的地址,几乎就像rows[i] = get_row(dbrow)
行不存在一样。
。gdb 显示行 [0](以及所有其他行)永远不会获得新值......
我在这里假设您正在查看get_rows
函数的返回值,而不是其局部变量 rows
的值。 问题是这样的:
rows = malloc(rowNumber * sizeof(row*));
您正在为函数接收的原始指针的副本(而不是原始指针)分配一个新值。 此更改在函数外部不可见。
如果需要为参数分配新值,则需要添加另一个间接级别。 记得;C 中的所有内容都是按值传递的。 因此,您的函数应将row***
作为其参数:
void get_rows(row ***rows) {
if(!rows) {
signal_some_error();
return;
}
...
*rows = malloc(rowNumber * sizeof(row*));
...
}
此外,正如 user1700513 指出的那样,您正在为行分配row*
。 这不可能是您的实际代码,因为它会导致编译器错误。
将row r = malloc(sizeof(row));
更改为row* r = malloc(sizeof(row));
。我想知道为什么您没有收到编译器警告。