C语言中结构变量里指针成员的引用问题

书上有例题是在定义一个结构变量的时候就初始化了,我想改为自己输入数值的形式,就遇上指针成员的引用问题#include"stdio.h"structitem{char*na... 书上有例题是在定义一个结构变量的时候就初始化了,我想改为自己输入数值的形式,就遇上指针成员的引用问题
#include"stdio.h"
struct item
{
char *name;
float price;
int sales;
float income;
};
main()
{
struct item check;
scanf("%s",check.name);
printf("%s",check.name);
}

这是我编的一部分程序,编译时好像是输出的时候有问题,我试过把指针成员换成数组成员,就没有问题了,是不是有什么写法是我没注意到的呢?对指针成员的引用是check.*name 吗?
可是我编译还是不对哇...
书比较烂,没有相关的例题,求大家指教
展开
 我来答
天池血崩
推荐于2016-07-29 · TA获得超过3698个赞
知道小有建树答主
回答量:202
采纳率:0%
帮助的人:267万
展开全部
1.
struct item
{
char *name;
...
其中name作为字符串其长度未定义,虽然符合语法(指针本身就没有要求定义长度的)。对于这种未赋初值的字符串,需要定义一个有长度的数组。
改成char name[20];
我明白楼主的意思,是想定义一个长度不固定的字串,但是这是C,pchar类型的并不是严格意义上的串,建议使用C++中的string类型,可以不定义长度。

2.
scanf/printf在字符串引用时应使用指针形式,所以应该是check.name
百度网友e7d13b2
2010-07-13 · TA获得超过469个赞
知道小有建树答主
回答量:159
采纳率:0%
帮助的人:124万
展开全部
这问题理论上其实很简单,因为指针保存的是首地址,所以在初始化指针的时候如果没有赋值指针就会乱指造成系统错误。
所以必须对结构体内指针成员进行初始化
struct item check;
char a[20];
check.name=a;
scanf("%s",check.name);
printf("%s",check.name);
那可不可以在struct item check;下面加一句strcpy(check.name,"1212");进行赋值呢?如果成员name是数组就没问题,但是指针却还是会报错,为什么呢?
你可以多加几个输出函数用于输出结构体首地址、数组a的首地址、还可以定义个指针指向数组a输出首地址。
这样你就会发现,结构体中的指针成员*name保存的始终是它在结构体中的地址,就算它指向其他指针地址也不会改变。这应该是结构体获取到的地址有关,成员的地址必须是连续的并且是结构体变量获取到的地址范围中。
所以我的理解是strcpy(check.name,"1212");不行的原因是地址强行赋值造成系统错误,而check.name=a;的意思是调用数组a的地址取值,所以这2种赋值方法还是有一定区别的。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
猪头或火宝宝
2010-07-12 · TA获得超过2758个赞
知道小有建树答主
回答量:1001
采纳率:0%
帮助的人:1528万
展开全部
其实你关于指针的问题;其实指针在定义的时候必须初始化,
比如用指针输入字符串;char *p,s[10];p=s;sacnf("%s",p);这样就可了;但楼主要改为:char *p;sacnf("%s",p);运行就和楼主遇到的问题一样哈!!!

楼主可以改为:

#include"stdio.h"

struct item
{
char name[20];
float price;
int sales;
float income;
};

main()
{
struct item check;
scanf("%s",check.name);
printf("%s",check.name);
}

这样就可以啦!!!好运!!!
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
21147813
2010-07-20 · TA获得超过364个赞
知道小有建树答主
回答量:400
采纳率:0%
帮助的人:0
展开全部
已经有人回复了 我就补充一点吧

struct就是一个内存块,你name不赋予空间,其实就只有8个字节长度的内存空间而已。如果你输入10个字符,那么就是10个字节,其实你这个时候读name还是读得出来的,但他下边的price,sales就都错掉了。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
yql1990115
2010-07-13 · TA获得超过304个赞
知道小有建树答主
回答量:159
采纳率:0%
帮助的人:199万
展开全部
main()
{
struct item check;
scanf("%s",check.name);
printf("%s",check.name);
}

楼主试试将scanf("%s",check.name);改为scanf("%10s",check.name);,或许可以
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(6)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式