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