2

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

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。

换句话说,“状态”成员被“损坏”。我注意到,如果我更改结构数据的顺序,输出会更改,但总会有数据损坏。

我定义结构的方式有什么问题吗?谢谢!

4

4 回答 4

10

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

于 2013-05-03T20:42:11.577 回答
6

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

于 2013-05-03T20:43:08.553 回答
3

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

于 2013-05-03T20:43:56.183 回答
2

这是因为您的 char 数组缺少空终止符(状态缓冲区没有空间)。printf继续打印直到遇到空终止符,它不进行边界检查。

于 2013-05-03T20:43:52.960 回答