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 吗?
可是我编译还是不对哇...
书比较烂,没有相关的例题,求大家指教 展开
#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 吗?
可是我编译还是不对哇...
书比较烂,没有相关的例题,求大家指教 展开
8个回答
展开全部
1.
struct item
{
char *name;
...
其中name作为字符串其长度未定义,虽然符合语法(指针本身就没有要求定义长度的)。对于这种未赋初值的字符串,需要定义一个有长度的数组。
改成char name[20];
我明白楼主的意思,是想定义一个长度不固定的字串,但是这是C,pchar类型的并不是严格意义上的串,建议使用C++中的string类型,可以不定义长度。
2.
scanf/printf在字符串引用时应使用指针形式,所以应该是check.name
struct item
{
char *name;
...
其中name作为字符串其长度未定义,虽然符合语法(指针本身就没有要求定义长度的)。对于这种未赋初值的字符串,需要定义一个有长度的数组。
改成char name[20];
我明白楼主的意思,是想定义一个长度不固定的字串,但是这是C,pchar类型的并不是严格意义上的串,建议使用C++中的string类型,可以不定义长度。
2.
scanf/printf在字符串引用时应使用指针形式,所以应该是check.name
展开全部
这问题理论上其实很简单,因为指针保存的是首地址,所以在初始化指针的时候如果没有赋值指针就会乱指造成系统错误。
所以必须对结构体内指针成员进行初始化
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种赋值方法还是有一定区别的。
所以必须对结构体内指针成员进行初始化
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种赋值方法还是有一定区别的。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
其实你关于指针的问题;其实指针在定义的时候必须初始化,
比如用指针输入字符串;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);
}
这样就可以啦!!!好运!!!
比如用指针输入字符串;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);
}
这样就可以啦!!!好运!!!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
已经有人回复了 我就补充一点吧
struct就是一个内存块,你name不赋予空间,其实就只有8个字节长度的内存空间而已。如果你输入10个字符,那么就是10个字节,其实你这个时候读name还是读得出来的,但他下边的price,sales就都错掉了。
struct就是一个内存块,你name不赋予空间,其实就只有8个字节长度的内存空间而已。如果你输入10个字符,那么就是10个字节,其实你这个时候读name还是读得出来的,但他下边的price,sales就都错掉了。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
main()
{
struct item check;
scanf("%s",check.name);
printf("%s",check.name);
}
楼主试试将scanf("%s",check.name);改为scanf("%10s",check.name);,或许可以
{
struct item check;
scanf("%s",check.name);
printf("%s",check.name);
}
楼主试试将scanf("%s",check.name);改为scanf("%10s",check.name);,或许可以
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询