struct MYINFO
{
char name[20];
char ip[20];
char sex[2];//问题就在于这个元素,赋值的时候,谁在它后面,就会把后面的值也带上
                     //如果后面没有元素或者不给后面元素赋值,就没错了
char age[3];
char addr[120];
};//头文件事先定义的结构体 MYINFO info;
memset(&info,0,sizeof(info)); memcpy(info.name,"这是名字",20);
memcpy(info.ip,"这是IP",20);
memcpy(info.sex,"男",2);
memcpy(info.age,"20",3);
memcpy(info.addr,"这是地址",120);//.cpp中给它赋值结果,sex这里老是会出错,具体的请看图:
这张图没有问题,还没运行到age
这张图里面,sex后面跟上了age
这张图我没给age赋值,结果sex后面跟上了addr问题:
1.为什么?
2.为什么只是sex这个元素会这样,其他的都不会?

解决方案 »

  1.   

    汉字要占两个字节,你的空间不够,char sex[3];
      

  2.   

    恩,是这个原因。可是,sex的空间已经不够了,后面怎么还能装下年龄或者地址呢?
      

  3.   

    sex不够只不过造成这个数组溢出,后面的还是可以装,只不过访问sex会有问题
      

  4.   

    你结构体的空间是连续的,你sex的空间不够会移到下面的age,然后你再给age赋值就会把原来溢出的部分(具体说是'\0')给冲掉,而显示的时候是找到'\0'作为一个完整的字符串,所以会把后面的age给显示出来,要不然你最后再给sex赋值看看,sex肯定是对的,但是age就不对了!
      

  5.   


    系统给结构体对象分配内存时是连续的一段地址空间。你这个char sex[2];不足以存放汉字字符串(字符串还有个结束符需要一个char空间来存储),但是整段结构体内存是连续的,所以memcpy操作可以把这个汉字字符串写到超出 sex[2]的地址段里。只不过你访问 info.sex 的时候得到的结果并不是 “男”,而是包含了后面的。
    注意:memcpy()函数并不是遇到字符串结束符 '\0'就停止,而是会把这个 '\0'也复制。
      

  6.   

    memcpy(info.sex,"男",2);//这行代码,因为字符串 "男"一共需要3个字节来存储(结尾有个字符串结束符 '\0').所以,这行代码,一共会拷贝3个字节的内容到 info.sex 所指向的地址,也就是占用了 info.age[] 的第一个字节空间,也就是 info.age[0]='\0'.而如果后面的 memcpy(info.age,"20",3); 再进行赋值。则又是从 info.age[] 的第一个字节空间开始写的,所以会把char age[3]的三个字节分别写为'2'、'0'、'\0' 这三个数值。当你访问 info.sex[]的内容时,原本在age[]数组的首地址的 结束符 info.age[0]='\0',由于后面的memcpy(info.age,"20",3); 导致结束符的位置变了,在 info.age[2]的位置了。所以会连带age[]的内容一起读取出来。所以只要后面赋值,就必定会使得 sex[]的内容不对。而如果你把  char sex[2] 改为 char sex[3],就不存在这个问题了,因为memcpy(info.sex,"男",2);结束后,结束符'\0'刚好在 sex[]数组的最后一个单元而不会是在age[]数组的开头了。