结构成员的奇怪变化

时间:2013-05-03 20:40:39

标签: c

我已经尝试了几乎所有东西,但我无法解决这个问题。我有一个结构:

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!

4 个答案:

答案 0 :(得分:10)

您需要使char数组长1个字节以允许空终止符。特别是,根据您使用它们的方式,statusdateOfBirth字段应分别为2和11个字节。 strcpy复制给定数据加1个空终止符字节。没有它,strcpy最终会在该成员之后写一个字节(在这种情况下可能是下一个成员,因为char数组可能最终会有一个字节对齐)。

答案 1 :(得分:6)

在C中,字符串是以0字节终止的char数组,因此char数组需要长一个字节。

答案 2 :(得分:3)

您的char数组statusdateOfBirth太短;你需要考虑终止空字符。

答案 3 :(得分:2)

这是因为你的char数组缺少空终止符(状态buff没有空格)。 printf继续打印,直到遇到空终止符,它没有边界检查。