将字符串复制到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?
答案 0 :(得分:2)
数组太小,N
个字符串需要N
个字符+1。
严格来说是未定义的行为,但观察到的行为可归因于struct
的存储是连续分配的事实,因此您正在打印“大字符串“由两个数组组成。
但是这个假设也是错误的,因为“大字符串”缺少'\0'
终结符,因为你已经使用了数组中所有可能的元素并复制了非'\0'
字符加入其中。
因此,您的程序的实际结果应该被认为是不可预测的,并且您观察到的行为实际上是未定义的行为。
答案 1 :(得分:1)
注意:字符串不仅仅是一个字符数组,而是以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