在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
实现中的->
期望取消引用项
以获得记录
,而不是取消引用项*
以获得项
。是的,我同意你的看法。我已经对你的答案表示赞同,并且只能鼓励其他人也这样做。这只会解决有关方法签名的编译问题,尽管正如您所指出的,他应该会因为错误地使用双指针而得到另一个错误。