struct中的char数组成员 - 将值复制到两个成员

时间:2016-11-05 11:25:33

标签: c arrays string struct

将字符串复制到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?

2 个答案:

答案 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