gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 07:05:26 25 4
gpt4 key购买 nike

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

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 显示 rows[0](以及所有其他行)从未获得新值,也就是说,它总是指向相同的地址,几乎就像rows[i] = get_row(dbrow) 行不存在。

最佳答案

...gdb shows that rows[0] (and all the others) never gets a new value...

我在这里假设您正在查看 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* 分配给一行。这不能是您的实际代码,因为它会导致编译器错误。

关于c - 在c中的循环中添加指向动态指针数组的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12696556/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com