[英]char array members in struct - value copied to both members
将字符串复制到struct并仅打印一个属性时,将同时打印struct的两个成员。 为什么会发生这种情况以及如何克服呢?
typedef struct {
char a1[14];
char a2[2];
} X;
void main() {
X x;
strcpy(x.a1, "55555555555555");
printf("A1 - %s\n\n", x.a1);
strcpy(x.a2, "D5");
printf("A1 - %s\n\n", x.a1);
printf("A2 - %s\n\n", x.a2);
}
输出:
A1 - 55555555555555
A1 - 55555555555555D5
A2 - D5
为什么D5在这里附加到A1上?
数组太小,一串N
字符需要N
字符+1。
这是严格未定义的行为 ,但是观察到的行为可以归因于以下事实:该struct
的存储空间是连续分配的,因此您要打印由两个数组组成的“ 大字符串 ”。
但是这种假设也是错误的,因为“ 大字符串 ”缺少'\\0'
终止符,因为您已经使用了数组中所有可能的元素并将非'\\0'
字符复制到其中。
因此,程序的实际结果应该被认为是不可预测的,而您观察到的行为实际上就是未定义的行为 。
注意:字符串不仅是字符数组,而且是以nul
字符 ( \\0
) 结尾的字符数组。
这里您有:
char a1[14];
char a2[2];
然后将它们初始化为
5555... 14 times
D5
在这里,您没有\\0
字符来标记字符串的结尾 ,因此,当您尝试打印字符数组时,会导致未定义的行为 。
尝试在每个字符数组的末尾给\\0
字符留一个空格
char a1[15]; //extra space for the null terminating character
char a2[3]; //similarly here
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.