Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在c中向循环中的动态指针数组添加指针_C_Pointers_Struct_Malloc - Fatal编程技术网

在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中没有按引用传递这样的东西。所有东西都是按值传递的,所以当您需要为参数指定新值时,您必须添加额外的间接级别。