初始化结构数组。为什么执行结果有冗余值?

时间:2013-05-17 12:12:41

标签: c

示例:

声明struct:

struct table
{
    char r1[6];
    char r2[2];
    char r3[6];
};

/* main */

int main()
{
     struct table t[10];
      int i;
      f010_Initial (t);
      for (i=0; i<10 ; i++)
      {
        printf ("%5s %5s %5s\n", t[i].r1,t[i].r2, t[i].r3);
      }
    getchar();
    return 0;
}

/* initial struct */ 

void f010_Initial (struct table t[10])
{
    int i;
      for (i=0; i<10; i++)
      {

        strncpy (t[i].r1, "aaaaaa", 6);
          t[i].r1[6] = '\0';

        strncpy (t[i].r2, "aa", 2);
          t[i].r1[2] = '\0';

        strncpy (t[i].r3, "aaaaaa", 6);
          t[i].r3[6] = '\0';
      }
}

为什么执行是这样的:

aa aaaaaaaa aaaaaaaaaaa  aa aaaaaaaa aaaaaaaaaa  aa aaaaaaaa aaaaaaaaaa  aa aaaaaaaa aaaaaaaaaa  aa aaaaaaaa aaaaaaaaaa  aa aaaaaaaa aaaaaaaaaa  aa aaaaaaaa aaaaaaaaaa  aa aaaaaaaa aaaaaaaaaa  aa aaaaaaaa aaaaaaaaaa  aa aaaaaaaa aaaaaaaaa

4 个答案:

答案 0 :(得分:3)

当您声明char r1[6];时,您无法执行此操作:t[i].r1[6] = '\0'; - 您的数组有6个元素,因此您可以访问的最高元素索引是5.否则就是注销数组的结束然后所有的赌注都关闭了。你真的很幸运,它没有做比它更糟糕的事情!

答案 1 :(得分:2)

您需要在每个数组中分配一个额外的字符来保存0终止符。因此,将结构定义更改为

struct table
{
    char r1[7];
    char r2[3];
    char r3[7];
};

完成此操作后,使用

将终结符插入最终位置是正确的
t[i].r1[6] = '\0';
你正在做的事情。 (数组索引从零开始,因此七个条目位于r1[0]r1[6]的位置。)

答案 2 :(得分:0)

请注意,例如,您有char r1[6];但不应引用r1[6],因为它超出了数组范围:您应该使用r1[0] to r1[5]。在这种特殊情况下,考虑到结构的布局,r1[6]可能指向r2[0]

答案 3 :(得分:0)

正确检查你正在重写r[1]两次的函数,也请检查结构索引,你是溢出的,如果结构大小为6可以从0到5索引不能是6。