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语言中,作为程序员,您需要确保不会读取或写入超出缓冲区处理能力的数据