当将字符串复制到struct并只打印一个属性时,将打印struct的两个成员。为什么会发生这种情况?如何克服这种情况?
typedef struct {
char a1[14];
char a2[2];
} X;
void main() {
X x;
strcpy(x.a1, "55555555555555");
printf("A1 - %snn", x.a1);
strcpy(x.a2, "D5");
printf("A1 - %snn", x.a1);
printf("A2 - %snn", x.a2);
}
输出:A1 - 55555555555555
A1 - 55555555555555D5
A2 - D5
为什么D5在这里附加在A1后面?
数组太小,您需要N
字符+1的N
字符字符串。
这是严格未定义的行为,但观察到的行为可以归因于struct
的存储是连续分配的,因此您正在打印由两个数组组成的"大字符串"。
但是这个假设也是错误的,因为"大字符串"缺乏' '
终止符,因为您已经使用了数组中所有可能的元素并将非' '
字符复制到它们中。
所以你的程序的实际结果应该被认为是不可预测的,你所观察到的行为实际上是未定义的行为
注意:字符串不仅仅是一个字符数组,而是以nul
字符 (