【问题标题】:Assigning values to a key in a pointer to a record in C将值分配给指向 C 中记录的指针中的键
【发布时间】:2012-03-29 02:49:59
【问题描述】:

对不起,如果标题有点混乱。我正在做的是创建一个结构,例如:

struct record
{
    int value;
    int key;
};

然后使用 typedef 调用指针来记录“Item”,如下所示:

typedef struct record* Item;

基本上,如果有人碰巧有这本书,我会关注 Robert Sedgewick(第三版)在 C 语言中的算法是如何完成的。

我遇到的问题是从控制台读取一个值,然后将其分配给键。这是我所拥有的,以及我得到的错误:

void setKey(Item *element, int x)
{
    element->key = x;
}

void standInput(Item A[], int length)
{
    int i;
    int x;
    for(i = 0; i < length; i++)
    {
        printf("Enter a value for spot %i: ", i+1);
        scanf("%d", &x);
        setKey(A[i], x);
    }
}

gcc Item.h
Item.h:33:6: warning: conflicting types for ‘setKey’
Item.h:23:3: note: previous implicit declaration of ‘setKey’ was here

如果我能推动正确的方向,我将不胜感激。当 Item 只是简单的整数时,我让这个作业的程序完美地工作,但现在我正在尝试使用 Item->Key,我有点迷失了 :) 谢谢!

如果有人需要我认为不需要的任何其他代码部分,我会在看到请求后立即发布。

修订:我将 setKey 函数移到 standInput 上方,因此编译错误消失了。我得到的是一个段错误,所以我仍然分配错误:)

【问题讨论】:

  • +1 表示措辞恰当、完整的问题,包括您尝试过的内容的描述和错误消息。 如此令人耳目一新
  • 您是否为数组中的每个项目分配内存?

标签: c pointers struct


【解决方案1】:

setKey 采用指向Item 的指针。 A[i] 不是指向 Item 的指针,而是实际的 Item 对象。

要将其作为指针传递,请执行以下任一操作:

setKey(A + i, x);

setKey(&amp;A[i], x);

【讨论】:

  • 我相信第二种方法是首选;它更清楚发生了什么。
  • setKey 采用指向 Item 的指针,但它不应该。在setKey 的实现中的-&gt; 期望取消引用Item 以获得record,而不是取消引用Item* 以获得Item
  • 是的,我同意你的 Wyzard。我已经 +1 了你的答案,只能鼓励其他人也这样做。这只会解决有关方法签名的编译问题,尽管正如您所指出的,他应该得到另一个关于错误使用双指针的错误。
【解决方案2】:

需要传递数组元素的地址:

setKey(&A[i], x);

A[i] 的类型是 Item,而不是 Item *,正如 setKey 方法所期望的那样

编辑 正如 Wyzard 所指出的,Item 已经是指向结构的指针,因此您应该将 setKey 的签名更改为采用 Item 而不是 Item * 并调用它是setKey(A[i], x)

【讨论】:

  • Hrm,这并没有完全做到,但我会玩弄它,看看我是否无法启动并运行它。我没有发现 & 号问题,所以谢谢你!
  • @user684594:我稍微更新了我的答案。为了解决段错误,您需要显示更多代码(例如哪个代码正在调用standInput)。
【解决方案3】:

setKey 的第一个参数的类型应该是Item,而不是Item *,因为Item 类型已经一个指针。您想传递指向记录的指针,而不是指向记录的指针。

【讨论】:

    猜你喜欢
    • 2014-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-19
    • 2018-05-16
    • 2022-07-06
    • 2011-04-02
    • 1970-01-01
    相关资源
    最近更新 更多