我很抱歉,如果这是一个非常简单的问题,但我在C中真的很生气,谷歌搜索到目前为止还没有帮助。我有一个C函数,它接受一个结构数组和一个整数:
int foo(struct record *records, int n)
{
}
以及每个节点都有结构的链表:
struct rnode
{
struct record rec;
struct rnode *next;
}
和struct记录是:
struct record
{
enum recordtype type;
union recordvalue
{
int intval;
char strval[19];
} value;
};
在foo里面(struct record ,int )我正在遍历链表并将第一个“n”结构记录分配到数组中,如:
int foo(struct record *records, int n)
{
int count = 0;
struct rnode *cur = recordlist;
while(cur != NULL)
{
records[count] = cur->rec; //Basically, how do I write this line?
printf("%d\n", records[count].type); //Both these print the correct values
printf("%d\n", records[count].value.intval); //Prints correct values
count++;
}
}
我尝试过: 记录[count] = cur-> rec
编译但是当我执行以下操作时:
struct record *records = malloc(sizeof(struct record)*n);
foo(records, n); //This should populate the array records but it isn't.
//If I print record[0].value.intval here I get 0.
但当我将& records [0]传递给另一个函数时,如:
checkrecord(&record[0]);
声明了checkrecord:
checkrecord(const struct record *r)
在该函数内部,r-> type和r-> value.intval都返回0而不是正确的值。
我很确定我正在将结构记录正确地存储到数组中,但我不确定我还有什么问题。
我并不是说听起来很顽固,但问题是checkrecord()函数我不能自由改变,但我可以改变我将参数传递给它的方式。
答案 0 :(得分:0)
*(cur->rec)
根据您发布的样本,这不应该有效。
复制记录结构的正确方法是:
records[count] = cur->rec;
如果你想要一个指向链表中实际结构的指针,你需要有一个指针数组来记录,而不是你当前的记录数组。在这种情况下,您可以使用:
进行分配records[count] = &(cur->rec);
答案 1 :(得分:0)
记录[count] = cur-> rec是正确的,但是你缺少cur = cur-> next。记录[1]是第二个记录,& record [1]是它的地址。
答案 2 :(得分:0)
感谢大家的帮助。这实际上是其他地方的记忆问题。上面的代码是正确的。