结构值中的C字符数组成员拷贝到两个成员



当将字符串复制到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字符 ()

结束的字符数组

给你:

char a1[14];
char a2[2];  

初始化为

5555... 14 times
D5

这里你没有字符来标记字符串的结束,所以当你试图打印字符数组时,它会导致未定义的行为

尝试在每个字符数组

的末尾为字符提供一个空格
char a1[15]; //extra space for the null terminating character
char a2[3];  //similarly here

相关内容

最新更新