永发信息网

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

答案:6  悬赏:40  手机版
解决时间 2021-01-16 03:58
C语言中结构变量里指针成员的引用问题
最佳答案
1.
struct item
{
char *name;
...
其中name作为字符串其长度未定义,虽然符合语法(指针本身就没有要求定义长度的)。对于这种未赋初值的字符串,需要定义一个有长度的数组。
改成char name[20];
我明白楼主的意思,是想定义一个长度不固定的字串,但是这是C,pchar类型的并不是严格意义上的串,建议使用C++中的string类型,可以不定义长度。

2.
scanf/printf在字符串引用时应使用指针形式,所以应该是check.name
全部回答
已经有人回复了 我就补充一点吧
struct就是一个内存块,你name不赋予空间,其实就只有8个字节长度的内存空间而已。如果你输入10个字符,那么就是10个字节,其实你这个时候读name还是读得出来的,但他下边的price,sales就都错掉了。
记得先给name分配空间
程序修改如下:
#include
#include
struct item
{
char *name;
float price;
int sales;
float income;
};
main()
{
struct item check;
check.name = (char *)malloc(20 * sizeof(char));
sc
anf("%s",check.name);
printf("%s",check.name);
free(check.name);
}
char *name; 是个指针啊
scanf读到什么地方了
结构体中的字符变量、字符数组都不能直接使用scanf直接输入,只能使用字符函数strcpy()进行输入
这问题理论上其实很简单,因为指针保存的是首地址,所以在初始化指针的时候如果没有赋值指针就会乱指造成系统错误。
所以必须对结构体内指针成员进行初始化
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种赋值方法还是有一定区别的。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
天天快递(偃师店)地址有知道的么?有点事想过
星光酒家这个地址在什么地方,我要处理点事
Linux输出重定向>和>gt;的区别是什么
0.5molH2O中约含有几个H2O
请帮忙选择
三星l3怎么截屏,谢谢了.
用弹性理论,简要评述“薄利多销”这一经商理
请问在遵义矫正牙齿多少钱
男人有了小四后,他心里还有小三吗
东庙河村有桃树120棵,比梨树多1/4,梨树有
《指环王》中所使用的精灵语
装修中将主梁末端被打了2个110公分的孔洞怎样
哪个手游吃鸡没电脑人
杨洋什么时候加入欢瑞世纪旗下艺人名单
天龙里 我72级 该去干什么
推荐资讯
618期间 17款MacBook Pro 15寸会降价吗
NBA全明星为什么不能超过200分
现在 什么样类型的歌曲 比较受年轻人喜欢
占用农民土地赔偿标准
VOV的粉饼好用吗?
洗脸时加几滴醋,这个醋指的是什么醋?
7.2チ7ᄒ23.6 8チ7ᄒ
tiffany和i do的钻戒最便宜的多少钱?
佛教宗派是什么意思
JM美白蚕丝面膜怎么样
道家 有什么练内丹的好书?
如图所示,已知△ABC中,AB=6,AC=9,AD⊥BC
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?