示例:
声明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答案 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。