2012-10-02 38 views
2

我有一个表示在一个表中的行的结构:添加指针动态指针阵列中的一个环在C

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)行不存在。

+0

'rowNumber'从哪里来?你可以发布你的整个代码吗? –

+0

rowNumber被初始化为1.周围的代码处理数据库访问,有点麻烦,它的工作原理,它确实对所示的代码有影响。直到指针分配的所有内容都应该如此。 – cbaby

回答

5

... 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*到行。这不能成为你的实际代码,因为它会导致编译器错误。

+0

该问题在get_rows返回之前显示,直到赋值行后。它应该仍然工作,如果只在范围内,对吗? – cbaby

+0

所以,我上面提到的仍然是一个需要修正的错误,否则你的功能就没用了。如果在函数内部存在问题,那么你还没有发布所有相关的代码。 'get_row'每次都会返回一个'malloc'd指针,所以除非你在内存的某个地方跺脚,否则你的问题会丢失一些东西。 'malloc'不可能在连续两次返回相同的地址而没有在两者之间删除。 'd.a'和'd.b'是否正确地终止了C字符串? 5'字节大到足以容纳它们吗?在将它传递给函数之前,你如何声明'rows'? –

+0

@cbaby:...'rowNumber'的值是什么?这里缺少信息,我们需要更多的代码。 –

3

变化row r = malloc(sizeof(row));row* r = malloc(sizeof(row));。我想知道为什么你没有得到这个编译器的警告。

+1

它应该是一个错误,因为没有从'void *'到'row'的隐式转换。我敢打赌,这是一个错字,真正的代码声明了一个指针。 –

+0

是的,错字,对不起... – cbaby

+0

@cbaby:最好只是复制代码逐字。你有没有尝试我的建议? –