gpt4 book ai didi

对 for 循环和字符串常量感到困惑。给一个字符串常量超过它可以容纳的。

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:25:06 24 4
gpt4 key购买 nike

我是一个C初学者,今天遇到了一个困扰我几个小时的问题,我把问题所在的子句减掉了。

我用 Archlinux(gcc) 编译了它。

#include <stdio.h>

#define SIZE 10

int main()
{
char s[SIZE];
int i;
for (i = 0; i < SIZE; )
s[i++] = 'm';
s[i++] = '\n';
s[i] = '\0';
printf("%s/D\n", s, i);

return 0;
}

它工作没有错误。

输出是mmmmmmmmmm 11

删除了一行。 s[i++] = '\n';

#include <stdio.h>

#define SIZE 10

int main()
{
char s[SIZE];
int i;
for (i = 0; i < SIZE; )
s[i++] = 'm';
s[i] = '\0';
printf("%s %d\n", s, i);

return 0;
}

“i”变为 0。输出:mmmmmmmmmm 0

但一旦用 Cent OS(gcc) 编译。

“i”没有变成0。

回到 Archlinux。我输入了另一行。 int a = i", 引用 i;

#include <stdio.h>

#define SIZE 10

int main()
{
char s[SIZE];
int i;
for (i = 0; i < SIZE; )
s[i++] = 'm';
s[i] = '\0';
int a = i;
printf("%s/D\n", s, i);

return 0;
}

而且这次“i”没有变成0。

我是新手,谁能告诉我发生了什么事?

如果这只是我犯的一些愚蠢的错误,请告诉我,我会删除帖子。

谢谢!

最佳答案

C 数组是从零开始的,因此您示例中的有效索引是 [0..SIZE-1]。在循环结束时,i==SIZE。然后写入 s[SIZE],这是超出数组末尾的一个元素。这具有未定义的后果。

在你的测试中,&s[SIZE] == &i 所以你在这两种情况下都写入 i。在第一种情况下,'\n' 的 ascii 值恰好是您对 i 的预期值,因此您没有注意到该错误。在第二种情况下,你会更幸运,将 i 重置为 0 并发现数组溢出。

解决方法是更快地退出循环一次,为 char 数组中的空终止符留出空间

for (i = 0; i < SIZE-1; )
// ^^

关于对 for 循环和字符串常量感到困惑。给一个字符串常量超过它可以容纳的。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14232277/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com