Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 为什么我的指针不能访问结构的成员元素_C_Pointers_Structure - Fatal编程技术网

C 为什么我的指针不能访问结构的成员元素

C 为什么我的指针不能访问结构的成员元素,c,pointers,structure,C,Pointers,Structure,编译器抛出错误,表示无法将“int转换为lin”和无法转换 “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(); } 我想你对行号感到困惑。错误消息中有行号。

编译器抛出错误,表示无法将“int转换为lin”和无法转换 “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();
}

我想你对行号感到困惑。错误消息中有行号。请咨询他们,并注意下次将整个错误消息粘贴到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};
想想这个。您是否希望编译器猜测要分配给哪个成员?如果有多个
int
float
成员可供选择,该怎么办?如果您不提供,应该选择哪一个

要感谢你的编译器没有像你写
head++时那样替你猜
指示编译器将指针向前移动一个元素,超出
a
的末尾。这称为缓冲区溢出


你在读哪本书?

我想你对行号感到困惑。错误消息中有行号。请咨询他们,并注意下次将整个错误消息粘贴到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};
想想这个。您是否希望编译器猜测要分配给哪个成员?如果有多个
int
float
成员可供选择,该怎么办?如果您不提供,应该选择哪一个

要感谢你的编译器没有像你写
head++时那样替你猜
指示编译器将指针向前移动一个元素,超出
a
的末尾。这称为缓冲区溢出


你在读哪本书?

我想你想给头部的数据赋值,这就是你需要做的
head->data=9而不是
*头=9
。由于
head
是指向结构lin的指针,因此
*head
是head的对象,如果要为对象的数据成员赋值
object name->data member=value被使用。类似地,这里的浮点值是'head->next=10.5;'。你可以参考link,如果你能理解这是另一个

我想你想给头部的数据赋值,这就是你需要做的
head->data=9而不是
*头=9
。由于
head
是指向结构lin的指针,因此
*head
是head的对象,如果要为对象的数据成员赋值
object name->data member=value被使用。类似地,这里的浮点值是'head->next=10.5;'。您可以参考链接,如果您能理解这是另一个

如果您只想玩指针,那么您需要以这样一种方式进行指针运算,您将永远不会陷入分段错误或类型转换错误。请参考以下代码-

#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);
}
#包括
类型定义结构lin
{
int数据;
然后浮动;
}颂歌;
void main()
{
颂歌*头;
颂歌a;
head=&a;
*((int*)head)=9;//类型转换指针指向int,因为在此处指定int值
head=(ode*)((char*)head+sizeof(int));//将指针的大小增加整数,然后分配浮点内存
*((浮动*)压头)=10.5;
head=(ode*)((char*)head-sizeof(int));//再次转到头的开头
printf(“头部->数据:\n头部->下一步:”,头部->数据,头部->下一步);
}

由于这会让其他程序员感到困惑和不可读,您可以简单地使用->运算符为结构的数据成员赋值。

如果您只想使用指针,那么您需要以这样一种方式进行指针运算,这样您就不会出现分段错误或类型转换错误。请参考以下代码-

#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);
}
#包括
类型定义结构lin
{
int数据;
然后浮动;
}颂歌;
void main()
{
颂歌*头;
颂歌a;
head=&a;
*((int*)head)=9;//类型转换指针指向int,因为在此处指定int值
head=(ode*)((char*)head+sizeof(int));//将指针的大小增加整数,然后分配浮点内存
*((浮动*)压头)=10.5;
head=(ode*)((char*)head-sizeof(int));//再次转到头的开头
printf(“头部->数据:\n头部->下一步:”,头部->数据,头部->下一步);
}

由于这有点混乱,其他程序员也看不懂,您可以简单地使用->运算符为结构的数据成员赋值。

请学习使用正统的缩进样式,不要在一行上放多个语句。请尝试
*head=9;head++*水头=10.5-->
head->data=9;head->next=10.5是,
head
指向
a
,因此您可以分配
head->data=9
head->next=10.5。增量使
指向一个不确定的位置-在增量之后,您无法安全地解除对它的引用。或者,使用C99,您可以编写
*head=(ode){9,10.5}使用复合文字;甚至
*head=(ode){.next=10.5,.data=9}也使用指定的初始值设定项。是否尝试使用并集而不是结构?请学习使用正统缩进样式,不要在一行上放置多个语句。请尝试
*head=9;head++*水头=10.5-->
head->data=9;head->next=10.5是,
head
指向
a
,因此您可以分配
head->data=9
head->next=10.5。增量使
head
p