C 结构成员中的奇怪变化
我几乎什么都试过了,但解决不了这个问题。我有一个结构:C 结构成员中的奇怪变化,c,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,
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,彼得,什么的..但是它没有!
它打印->M14-11-2000,14-11-2000,彼得,什么的
换言之,“状态”成员将“损坏”。
我注意到,如果我改变结构数据的顺序,输出就会改变,但总有一个数据会被破坏
我定义结构的方式有什么错误吗?谢谢 您需要使字符数组长1字节,以允许空终止符。特别是,
status
和dateOfBirth
字段应分别为2和11字节,具体取决于您使用它们的方式strcpy
复制给定数据加上1个空终止符字节。否则,strcpy将在该成员之后写入一个字节(在本例中,这可能是下一个成员,因为字符数组可能以一个字节对齐结束)。在C中,字符串是以0字节结尾的字符数组,因此,您的字符数组需要长一个字节。这是因为您的字符数组缺少空终止符(status buff没有空间容纳一个)printf
继续打印,直到遇到空终止符,它不进行边界检查。您的char
数组状态和出生日期太短;您需要考虑终止的空字符 “M”实际上是两个字符,有“M”和终止符哦,我明白了,非常感谢。我花了好几个小时才找到这个!还请注意,这是strcpy的一个更安全的版本,因为它将确保它不会复制太多。@Kninnug:是的,这是一个很好的观点。遗憾的是,strncpy也有一些问题(主要是它不能保证结果以null结尾)。最后,我编写了自己的strcpy函数,它可以保证空终止,并且在所有平台上都能正常工作。没有CRT strcpy功能那么快,但所有构建中增加的安全性和一致性使其值得。@MarkWilkins同意,我确实说过更安全,而不是最安全;)。对于一个项目,我使用的struct
s的大小和该大小的(w)字符指针,因此我根本不需要空终止。有点像FORTRAN,但我相信这是最安全的方法(当然,只要指针的大小匹配)。我还必须重写CRT功能,但它允许字符串中包含\0
s。字符串文本在C中总是以null结尾,不需要手动将'\0'放在末尾。