【问题标题】:why cant my pointer access the member elements of the structure为什么我的指针不能访问结构的成员元素
【发布时间】:2017-09-08 04:23:01
【问题描述】:

编译器吐出错误说 can't convert "int to lin" and can't convert 当我的指针明显指向正确的位置时,“double to lin”。

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

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

【问题讨论】:

  • 请学会使用正统的缩进样式,不要将多个语句放在一行中。
  • 试试*head=9; head++; *head=10.5; --> head->data = 9; head->next = 10.5;
  • 是的,head 指向a,因此您可以指定head->data = 9;head->next = 10.5;。增量使head 指向一个不确定的位置——在增量之后你不能安全地取消引用它。或者,对于 C99,您可以使用复合文字编写 *head = (ode){ 9, 10.5 };;甚至 *head = (ode){ .next = 10.5, .data = 9 }; 也使用指定的初始化器。
  • 您是否尝试使用联合而不是结构?

标签: c pointers structure


【解决方案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);
}

由于这在某种程度上使其他程序员感到困惑且不可读,因此您可以简单地使用 -> 运算符为结构的数据成员赋值。

【讨论】:

  • 我运行你的代码,它给出了错误“void* 到 ode* 的无效转换”和错误“算术中使用的 void 类型指针”
  • 你似乎得到了一个问题,我试图找到一种方法在单个结构变量中来回移动指针,以便我可以访问结构的成员元素并操作它们的值,因为指向数组的指针可以通过增加指针的值来前后移动,因此必须有一种方法让结构指针在成员元素中移动,因为结构也是一个连续的内存块,其中只有不同的数据类型
  • @ozzy 我已经在 Linux 上运行它并且运行良好。你是怎么编译的?你使用的是哪个编译器?
  • @ozzy-尝试使用 char* 而不是 void*,忽略警告。
  • 现在显示错误“无法在分配中将 char* 转换为 ode*”
【解决方案2】:

我认为您对行号感到困惑。您的错误消息中有行号。请咨询他们,并注意下次将整个错误消息粘贴到 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 的末尾时那样。这称为缓冲区溢出。

你在看哪本书?

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-27
      • 1970-01-01
      • 1970-01-01
      • 2010-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多