【问题标题】:how to get a struct that inside of a struct and assign it to an array of structs如何获取结构内部的结构并将其分配给结构数组
【发布时间】:2011-02-15 09:09:08
【问题描述】:

如果这是一个非常简单的问题,我很抱歉,但我对 C 语言真的很生疏,谷歌搜索到目前为止没有帮助。我有一个 C 函数,它接受一个结构数组和一个整数:

int foo(struct record *records, int n)
{

}

还有一个链表,其中每个节点都有一个结构:

struct rnode
{
    struct record rec;
    struct rnode *next;
}

结构记录是:

struct record
{
    enum recordtype type;
    union recordvalue
    {
        int intval;
        char strval[19];
    } value;
};

inside 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++;
    }
}

我试着做: 记录[计数] = 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(const struct record *r)

在该函数内部,r->type 和 r->value.intval 都返回 0 而不是正确的值。

我很确定我正确地将结构记录存储到数组中,但我不确定我做错了什么。

我的意思不是听起来很固执,但问题是我不能随意更改 checkrecord() 函数,但我可以更改将参数传递给它的方式。

【问题讨论】:

  • records[count] = cur->rec 是对的,但我没有通过检查 &record[1] 得到你想要完成的事情。你想要结构里面的东西,records[1].some_member
  • @nos 出现在...&record[1] 只是要求指向第一条记录的指针...它永远不可能是“结构的
  • 是的,我打错了一些东西。我现在对其进行了编辑以澄清一点。
  • 然后发生了完全不同的事情,发布的代码没有任何问题。尝试编写一个给出此行为的完整示例。你漏掉了重要的部分。

标签: c arrays linked-list struct


【解决方案1】:
*(cur->rec)

鉴于您发布的示例,这应该不起作用。

复制记录结构的正确方法是:

records[count] = cur->rec;

如果你想要一个指向链表中实际结构的指针,你需要一个指向记录的指针数组,而不是你当前的记录数组。在这种情况下,您分配:

records[count] = &(cur->rec);

【讨论】:

    【解决方案2】:

    records[count] = cur->rec 是正确的,但是您缺少 cur = cur->next。而record[1]是第二条记录,&record[1]是它的地址。

    【讨论】:

    • 是的,我省略了 cur = cur->next,因为那部分并不重要。有没有办法在结构数组中为结构提供地址,并且仍然获取该结构中的值?
    • 如果你有一个结构的地址,它是否在一个数组中并不重要。给定 struct foo* p = &somefoo,p->bar 从 somefoo 中获取值 bar。如果这不是您要求的,那么您需要更精确。
    • @Yiling 好的,看看你的编辑,用 "checkrecord(&record[0]); ... checkrecord(const struct record *r) ... r->value" 完全正确,所以问题不在于您访问它们的方式,而在于其他问题。尝试发布更完整的示例。
    【解决方案3】:

    感谢大家的帮助。这实际上是其他地方的内存问题。上面的代码是正确的。

    【讨论】:

      猜你喜欢
      • 2021-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-08
      相关资源
      最近更新 更多