繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM