1

例子:

声明结构:

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';
      }
}

为什么执行是这样的:

啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊

4

4 回答 4

3

当你声明char r1[6];你不能这样做时:t[i].r1[6] = '\0';- 你的数组有6个元素,所以你可以访问的最高元素索引是5。否则就是注销你的数组的末尾,然后所有的赌注都被取消了。你真的很幸运,它没有做比它更糟糕的事情!

于 2013-05-17T12:16:39.097 回答
2

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

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

完成此操作后,将终止符插入到最终位置是正确的

t[i].r1[6] = '\0';

正如你已经在做的那样。(数组索引是从零开始的,因此七个条目的位置r1[0]一直到r1[6]。)

于 2013-05-17T12:16:33.983 回答
0

在这里要小心,例如你有 charr1[6];但你不应该引用r1[6]它,因为它超出了数组范围:你应该使用r1[0] to r1[5]. 在这种特殊情况下,r1[6]可能指向给r2[0]定结构的布局方式。

于 2013-05-17T12:17:07.117 回答
0

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

于 2013-05-17T12:26:55.823 回答