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

2024-11-08 13:17:46
推荐回答(5个)
回答1:

1.
struct item
{
char *name;
...
其中name作为字符串其长度未定义,虽然符合语法(指针本身就没有要求定义长度的)。对于这尘孙种未赋初值的字符派漏链串,需要定义一个有长度的数组。
改成char name[20];
我明白楼主的意思,是想定义一个长度不固定的字串,但是这是C,pchar类型的并不是严格意义上的串,建议使用C++中的string类型,可以不定义长度。

2.
scanf/printf在字符串引用时应使用指针形式,所以应搜斗该是check.name

回答2:

这问题理论上其实很简单,因为指针保存的是首地址,所以在初始化指针的时候如果没有赋值指针就会乱指造成系统错误。
所以必须对结构体内指针成员进行初始化
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种赋值方法还是有一定区别的。

回答3:

其实你关于指针的洞扮橘问题;其实指针在定义的时候必须初始化,
比如用指针输入字符缺芹串;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);
}

这纳团样就可以啦!!!好运!!!

回答4:

已经有人回复了 我就补充一点吧

struct就是一个内存块,你name不赋予空间,其实就只有8个字节长度的内存空间而已。如果你输入10个字符,那么就是并伏键10个字节,其实你这个时候读name还是读得出来的,绝巧但他下边的price,sales就厅隐都错掉了。

回答5:

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

楼主试试将scanf("%s",check.name);改为scanf("%10s",check.name);,或慧碧许可大伍以