事实上是没有变的,只是你看错了,因为结构体中的成员aa是一个只有一个长度的字符数组,而结构体中的成员地址是连续的,所以在aa[0]后面就是bb[0]。所以bb[0]成为'2'子bb[1]成为'\0'后aa是字符数组是以'\0'结束的就是"12"了!

解决方案 »

  1.   

    Phourm()回答的好正确.连续的内存地址,字符串以‘\0’结束.
      

  2.   

    同意楼上的
    当定义  char aa[1], 就相当于char *指针, 注意字符串是以'\0'结束的。
    而VC调试器在显示字符串也是这样工作的。
    如楼上兄台所言,结构体中的成员地址是连续的。
    而全局变量,系统会自动将它清0. 
    所以ab初始为: ab[n].aa[0]=0 ab[n].bb[0]=0 ab[n].bb[1]=0 …
    所以造成aa指向 "1,2,0"
    看起来就是 "12" 字符串了。
      

  3.   

    可是我如何正确的进行字符串比较呢?
    比如当我赋值结束后,想用
    strcmp(aa,"1")进行比较,但是得到的都是错误结果,如何避免?
    我总不能使用定长字符比较吧?
    strncmp(aa,"1",1);?是这样吗?
      

  4.   

    如Phourm()所说。只是你的空间不够大,不足以存下串“1”。对于一个字节长的字符串,你只比较第一个字符就行了。否则要保证空间足够大,放得下串。
      

  5.   

    还up干什么呢?你这么定义就行了
    typedef struct A_B{
    char aa[2];
    char bb[3];
    char cc[4];
    }aabb;
    要不,干脆定义成CString吧!
      

  6.   


    定义
    typedef struct A_B{
    char aa[2]; //大一个
    char bb[3]; //..
    char cc[4]; //..
    }aabb;
    aabb ab[10];初始
    for(int i=0; i < 10; i++)
    memset(&ab[i],0,sizeof(ab[i]));
    赋值
    strcpy(ab[1].aa,"1");
    strcpy(ab[1].bb,"22");