在c中向循环中的动态指针数组添加指针
我有一个表示表中一行的结构:在c中向循环中的动态指针数组添加指针,c,pointers,struct,malloc,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,
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;
}
最后,我有一个函数,它有一个行**rows
作为参数:
void get_rows(row **rows) {
...
rows = malloc(rowNumber * sizeof(row*));
int i;
for (i = 0; i < rowNumber; i++) {
rows[i] = get_row(dbrow);
}
}
void get_行(行**行){
...
行数=malloc(行数*sizeof(行数*);
int i;
对于(i=0;i
get_row按预期工作并返回一个指向有效行结构的指针,但gdb显示行[0](和所有其他行)从未获得新值,也就是说,它总是指向相同的地址,几乎就好像rows[i]=get_row(dbrow)
行不存在一样
…gdb显示行[0](和所有其他行)从未获得新值
我在这里假设您查看的是get_rows
函数的返回值,而不是其局部变量rows
的值。问题是:
rows = malloc(rowNumber * sizeof(row*));
您正在为函数接收的原始指针(而不是原始指针)的副本指定一个新值。此更改在功能外部不可见
如果需要为参数指定一个新值,则需要添加另一个间接级别。记住C中的所有内容都是通过值传递的。因此,函数应将行***
作为其参数:
void get_rows(row ***rows) {
if(!rows) {
signal_some_error();
return;
}
...
*rows = malloc(rowNumber * sizeof(row*));
...
}
另外,正如user1700513所指出的,您正在为一行分配一个
行*
。这不可能是您的实际代码,因为它会导致编译器错误。更改行r=malloc(sizeof(row))代码>至行*r=malloc(sizeof(行))代码>。我想知道为什么您没有收到编译器警告。这应该是一个错误,因为没有从void*
到行的隐式转换。我打赌这是一个输入错误,而真正的代码声明了一个指针。@cbaby:最好是逐字复制代码。你试过我的建议了吗?rowNumber
来自哪里?你可以发布你的全部代码吗?行数已初始化为1。周围的代码处理数据库访问,有点凌乱,它可以工作,并且确实对显示的代码有影响。指针赋值之前的所有内容都按其应有的方式工作。问题在get_行返回之前显示,在赋值行之后显示。如果只是在范围内,它应该仍然可以工作,对吗?所以,我上面提到的仍然是一个需要修复的错误,否则你的函数是无用的。如果函数内部也有问题,那么您还没有发布所有相关的代码get_row
每次都返回一个malloc
d指针,所以除非你在某个地方踩内存,否则你的问题缺少什么malloc
不可能在一行中两次返回同一地址,而中间不包含delete。d.a
和d.b
是否正确终止了C字符串?5
字节是否足够大以容纳它们?在将行
传递给函数之前,如何声明它?@cbaby:…行数
的值是多少?这里缺少信息,我们需要更多的代码。找到它:get_rows需要获取对行**rows的引用,正如您所指出的,我“按值”传递指针。@cbaby:…:很高兴你把它解决了。只是为了学究气;在C中没有按引用传递这样的东西。所有东西都是按值传递的,所以当您需要为参数指定新值时,您必须添加额外的间接级别。