typedef struct{
char firstname[15];
char lastname[20];
char status[1];
char dateOfBirth[10];
} Rec;
和一个主要的:
int main()
{
Rec rec;
strcpy(rec.status,"M");
strcpy(rec.dateOfBirth,"14-11-2000");
strcpy(rec.firstname,"Peter");
strcpy(rec.lastname,"Something");
printf("%s, %s, %s, %s\n", rec.status,rec.dateOfBirth,rec.firstname,rec.lastname);
return 0;
}
所以这个,应该打印 - > M,14-11-2000,Peter,Something ..但它不是! 它打印 - > M14-11-2000,14-11-2000,Peter,Something。
换句话说,“状态”成员被“破坏”。 我注意到,如果我改变结构数据的顺序,输出会发生变化,但总会有数据被破坏。
我定义结构的方式有什么不对吗? THX!
答案 0 :(得分:10)
您需要使char数组长1个字节以允许空终止符。特别是,根据您使用它们的方式,status
和dateOfBirth
字段应分别为2和11个字节。 strcpy
复制给定数据加1个空终止符字节。没有它,strcpy最终会在该成员之后写一个字节(在这种情况下可能是下一个成员,因为char数组可能最终会有一个字节对齐)。
答案 1 :(得分:6)
在C中,字符串是以0字节终止的char数组,因此char数组需要长一个字节。
答案 2 :(得分:3)
您的char
数组status
和dateOfBirth
太短;你需要考虑终止空字符。
答案 3 :(得分:2)
这是因为你的char数组缺少空终止符(状态buff没有空格)。 printf
继续打印,直到遇到空终止符,它没有边界检查。