C语言中结构变量里指针成员的引用问题
答案:6 悬赏:40 手机版
解决时间 2021-01-16 03:58
- 提问者网友:那叫心脏的地方装的都是你
- 2021-01-15 10:16
C语言中结构变量里指针成员的引用问题
最佳答案
- 五星知识达人网友:青灯有味
- 2021-01-15 11:32
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
全部回答
- 1楼网友:夜余生
- 2021-01-15 16:07
已经有人回复了 我就补充一点吧
struct就是一个内存块,你name不赋予空间,其实就只有8个字节长度的内存空间而已。如果你输入10个字符,那么就是10个字节,其实你这个时候读name还是读得出来的,但他下边的price,sales就都错掉了。
struct就是一个内存块,你name不赋予空间,其实就只有8个字节长度的内存空间而已。如果你输入10个字符,那么就是10个字节,其实你这个时候读name还是读得出来的,但他下边的price,sales就都错掉了。
- 2楼网友:空山清雨
- 2021-01-15 15:46
记得先给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);
}
程序修改如下:
#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);
}
- 3楼网友:蓝房子
- 2021-01-15 15:09
char *name; 是个指针啊
scanf读到什么地方了
scanf读到什么地方了
- 4楼网友:由着我着迷
- 2021-01-15 14:17
结构体中的字符变量、字符数组都不能直接使用scanf直接输入,只能使用字符函数strcpy()进行输入
- 5楼网友:骨子里都是戏
- 2021-01-15 12:41
这问题理论上其实很简单,因为指针保存的是首地址,所以在初始化指针的时候如果没有赋值指针就会乱指造成系统错误。
所以必须对结构体内指针成员进行初始化
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种赋值方法还是有一定区别的。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯