在C语言中为指向记录的指针中的键赋值

在C语言中为指向记录的指针中的键赋值,c,pointers,struct,C,Pointers,Struct,如果标题有点混乱,很抱歉。我所做的是创建一个结构,例如: struct record { int value; int key; }; 然后使用typedef调用指针来记录“Item”,如下所示: typedef struct record* Item; 基本上,我在关注罗伯特·塞吉威克(Robert Sedgewick,第三版)在《C语言的算法》(Algoriths in C)第290页上如何做到这一点,以防有人碰巧拥有这本书 我遇到的问题是从控制台读取一个值,然后将其分配

如果标题有点混乱,很抱歉。我所做的是创建一个结构,例如:

struct record
{
    int value;
    int key;
};
然后使用typedef调用指针来记录“Item”,如下所示:

typedef struct record* Item;
基本上,我在关注罗伯特·塞吉威克(Robert Sedgewick,第三版)在《C语言的算法》(Algoriths in C)第290页上如何做到这一点,以防有人碰巧拥有这本书

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

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
void设置键(项*元素,int x)
{
元素->键=x;
}
无效输入(项目A[],整数长度)
{
int i;
int x;
对于(i=0;i
如果我能得到一个正确的方向,我会非常感激。当项目只是简单的整数时,我让这个作业的程序运行得很好,但是现在我尝试使用项目->键,我有点迷路了:)谢谢

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


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

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

setKey(&A[i], x);
A[i]
的类型是
Item
而不是
setKey
方法所期望的
Item*


Edit正如Wyzard所指出的那样,Item
已经是指向结构的指针,因此您应该更改
setKey
的签名,以获取
项而不是
项*
,并将其称为
setKey(a[i],x)

setKey
获取指向
项的指针
A[i]
不是指向
项的指针,而是实际的
对象

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

setKey(A+i,x)


setKey(&A[i],x)

由于
类型已经是指针,因此
设置键的第一个参数的类型应该是
,而不是
项*
。您要传递的是指向记录的指针,而不是指向记录的指针。

+1是一个措辞得体的完整问题,包括您尝试的内容和错误消息的描述。所以,让人耳目一新的是,您是否为数组中的每个项目分配了内存?Hrm,这还不够,但我会尝试一下,看看是否无法启动并运行它。我没有注意到符号问题,所以谢谢你@user684594:我更新了我的答案。为了解决segfault,您需要显示更多的代码(例如,哪个代码正在调用
standInput
)。我认为第二种方法是首选方法;发生的事情要清楚得多。
setKey
使用指向
项的指针,但它不应该这样做。
setKey
实现中的
->
期望取消引用
以获得
记录
,而不是取消引用
项*
以获得
。是的,我同意你的看法。我已经对你的答案表示赞同,并且只能鼓励其他人也这样做。这只会解决有关方法签名的编译问题,尽管正如您所指出的,他应该会因为错误地使用双指针而得到另一个错误。