#include <stdio.h>
#include <string.h>
struct Student {
int id;
char name[10];
char sex;
int grade;
};
int main() {
struct Student std;
std.id = 1;
strcpy(std.name, "Kevin");
std.sex="M";
std.grade = 2;
printf("%d %s %s %d\n", std.id, std.name, std.sex, std.grade);
}
在此代码中,在 std 变量中分配性别字符时出错。 我认为“M”只是一个字符,因此它会像普通变量一样在结构中工作。
#include <stdio.h>
#include <string.h>
struct Student {
int id;
char name[10];
char sex[1];
int grade;
};
int main() {
struct Student std;
std.id = 1;
strcpy(std.name, "Kevin");
strcpy(std.sex, "M");
std.grade = 2;
printf("%d %s %s %d\n", std.id, std.name, std.sex, std.grade);
}
我修复了这样的代码然后它就可以工作了。
所以我的问题是,
我搜索但找不到答案。帮助我!
char
是标量类型,而 char[1]
是具有 ine 元素的数组类型。
"M"
是一个字符串文字,具有字符数组 char[2]
,在内存中的存储方式类似于 { 'M', '\0' }
。
在此声明中
std.sex="M";
您正在尝试将数组(字符串文字)
"M"
分配给类型为std::sex
的标量对象char
。在此赋值中,字符数组被隐式转换为指向其第一个元素的指针。其实你有
std.sex = &"M"[0];
虽然你至少需要写这样的
std.sex = "M"[0];
尽管使用整数字符常量代替字符串文字会更简单,更清晰,例如
std.sex = 'M';
相应地,在
printf
的调用中,您应该使用转换说明符c
而不是s
来输出单个字符
printf("%d %s %c %d\n", std.id, std.name, std.sex, std.grade);
^^
在第二个程序中,数据成员性别被声明为具有一个元素的数组
char sex[1];
然后这个电话
strcpy
strcpy(std.sex, "M");
写入数组外部的内存
sex
,因为如上所述,字符串文字"M"
有两个元素。
您可以像这样声明字符数组
char sex[2];
虽然您只使用一个字符,但足以声明数据成员
sex
为
char sex;
并按照上面第一个程序的注释中所示使用它。