为什么我的指针无法访问结构的成员元素

时间:2017-09-08 04:23:02

标签: c pointers structure

编译器吐出错误,说不能将" int转换为lin"并且无法转换 "加倍到林"当我的指针显然指向正确的位置时。

typedef struct lin
{
    int data;
    float next;
}ode;

void main()
{
    ode*head;
    ode a;
    head=&a;
    *head=9;
    head++;
    *head=10.5;
    getch();
}

3 个答案:

答案 0 :(得分:1)

我认为您对行号感到困惑。您的错误消息中有行号。请咨询他们,并注意下次整个错误消息粘贴到StackOverflow 的重要性。

如果您要检查错误所抱怨的行(通过行号;查找数字),您会看到:

*head=9;    // an attempt to assign an `int` to a `lin`
*head=10.5; // an attempt to assign a `double` to a `lin`

也许你的意思是:

head->data = 9;
head->next = 10.5

......或......

*head = (struct lin){.data = 9};
*head = (struct lin){.next = 10.5};

很难说。你甚至可能意味着:

head = &(struct lin){.data = 9};
head = &(struct lin){.next = 10.5};

想一想。您是否希望编译器猜出要分配给哪个成员?如果有多个intfloat成员可供选择,该怎么办?当你不提供哪一个时,应该选择哪一个?

感谢您的编译器没有为您猜测,就像您编写head++;指示编译器将指针向前推进一个元素一样,超出结束时a。这称为缓冲区溢出。

你在读哪本书?

答案 1 :(得分:1)

如果你只想玩指针,那么你需要做一个指针算术,你永远不会进入分段错误或类型转换错误。请参考以下代码 -

#include <stdio.h>

typedef struct lin
{
    int data;
    float next;
}ode;

void main()
{
    ode*head;
    ode a;
    head=&a;

    *((int*)head)=9; //typecast pointer to int because assigning int value here

    head = (ode*)((char*)head + sizeof(int)); //increase pointer by size of integer as after which memory for float is assigned

    *((float*)head)=10.5;

    head = (ode*)((char*)head - sizeof(int));//go to start of header again

    printf("head->data:<%d>\nhead->next:<%f>",head->data,head->next);
}

由于这在某种程度上令人困惑,而且对其他程序员来说无法读取,因此您只需使用 - &gt;运算符,用于为结构的数据成员赋值。

答案 2 :(得分:0)

我认为您想要为头部数据赋值,这是您需要做的事情 head->data=9;而不是*head=9。因为head是指向结构lin的指针,所以*head是头的对象,如果你想为对象object-name -> data-member = value;的数据成员赋值,则使用它。类似地,这里的浮动点是&#39; head-&gt; next = 10.5;&#39;。你可以参考链接here,如果你能理解这是另一个link