Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 结构成员中的奇怪变化_C - Fatal编程技术网

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'放在末尾。