C 联合内存分配::存储的内容比分配的内存多
我把工会定义为C 联合内存分配::存储的内容比分配的内存多,c,memory-management,struct,unions,C,Memory Management,Struct,Unions,我把工会定义为 union person { int roll; char fname[10]; char lname[20]; }p1; 而sizeof(p1)=20个字节。 但是,在p1中存储内容时,它会存储超过20个字符 void main() { printf("\n The size of the union is %zu\t",sizeof(p1)); printf("\n Enter the details here :\t");
union person
{
int roll;
char fname[10];
char lname[20];
}p1;
而sizeof(p1)=20个字节。
但是,在p1中存储内容时,它会存储超过20个字符
void main()
{
printf("\n The size of the union is %zu\t",sizeof(p1));
printf("\n Enter the details here :\t");
scanf("%d",&p1.roll);
scanf("%s",p1.fname);
scanf("%s",p1.lname);
printf("\n The union contains are \n");
printf("\n The roll no is :: \t %d",p1.roll);
printf("\n The fname is :: \t %s ",p1.fname);
printf("\n The laname is :: \t %s\n",p1.lname);
}
当我输入超过20个字符时,它仍然被存储
当我输入超过20个字符时,它仍然被存储
当然是。为什么不呢?你递给scanf一个指针,基本上是说“在这里写尽可能多的字符!”
这将防止scanf
溢出缓冲区。注意,我已经从每个长度中减去了一个,因为scanf
还需要编写NUL终止符
现在,下一个问题是:为什么要使用联合体
?联合用于提供相同数据的不同视图。给一个成员写信实际上会毁掉所有其他成员的内容union
s很少使用,与struct
s相反
如果要存储多条相关信息,请使用struct
struct person
{
int roll;
char fname[10];
char lname[20];
} p1;
当我输入超过20个字符时,它仍然被存储
当然是。为什么不呢?你递给scanf一个指针,基本上是说“在这里写尽可能多的字符!”
这将防止scanf
溢出缓冲区。注意,我已经从每个长度中减去了一个,因为scanf
还需要编写NUL终止符
现在,下一个问题是:为什么要使用联合体
?联合用于提供相同数据的不同视图。给一个成员写信实际上会毁掉所有其他成员的内容union
s很少使用,与struct
s相反
如果要存储多条相关信息,请使用struct
struct person
{
int roll;
char fname[10];
char lname[20];
} p1;
为了补充乔纳森的回答,我想指出,存储超过20个字符的原因是因为
scanf
不知道你的联盟
当你宣布联盟时
union person
{
int roll;
char fname[10];
char lname[20];
}p1;
说
scanf("%s",p1.lname);
scanf看到的所有内容都是将字符串存储到一个char*
中。它没有看到字符[20]
换句话说,作为一名程序员,您知道的附加信息,p1.lname
只有20个字符,scanf
看不到
一般来说,在C语言中,作为程序员,您需要确保不会读取或写入超出缓冲区处理能力的数据。为了补充Jonathon的回答,我要指出,存储超过20个字符的原因是因为
scanf
不知道您的联合
当你宣布联盟时
union person
{
int roll;
char fname[10];
char lname[20];
}p1;
说
scanf("%s",p1.lname);
scanf看到的所有内容都是将字符串存储到一个char*
中。它没有看到字符[20]
换句话说,作为一名程序员,您知道的附加信息,p1.lname
只有20个字符,scanf
看不到
一般来说,在C语言中,作为程序员,您需要确保不会读取或写入超出缓冲区处理能力的数据