mkv*_*cvc 2 c malloc struct pointers
我有一个表示表中一行的结构:
typedef struct {
char *a;
char *b;
} row;
Run Code Online (Sandbox Code Playgroud)
我有一个函数,它基于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;
}
Run Code Online (Sandbox Code Playgroud)
最后,我有一个函数,它有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);
}
}
Run Code Online (Sandbox Code Playgroud)
get_row按预期工作并返回一个指向有效行结构的指针,但是gdb显示rows [0](和所有其他的)永远不会得到一个新值,也就是说,它总是指向同一个地址,就好像该rows[i] = get_row(dbrow)行没有不存在.
... gdb显示rows [0](和所有其他的)永远不会获得新值...
我在这里假设您正在查看get_rows函数的返回值,而不是其局部变量的值rows.这是问题所在:
rows = malloc(rowNumber * sizeof(row*));
Run Code Online (Sandbox Code Playgroud)
您正在为函数接收的原始指针的副本分配新值,而不是原始值.在函数外部不会看到此更改.
如果需要为参数分配新值,则需要添加另一级别的间接.记得; C中的所有内容都按值传递.所以,你的函数应该row***作为它的参数:
void get_rows(row ***rows) {
if(!rows) {
signal_some_error();
return;
}
...
*rows = malloc(rowNumber * sizeof(row*));
...
}
Run Code Online (Sandbox Code Playgroud)
此外,正如user1700513指出的那样,您正在row*为一行分配一个.这可能不是您的实际代码,因为它会导致编译器错误.