我正在做K&R的《C编程语言书》中的练习。在练习2-4中,我正在编写一个实验代码:
void printstr(char s[])
{
int i=0;
while(s[i] != '\0')
{
printf("%c", s[i++]);
}
printf("\n");
}
int main()
{
char sa[] = {'a', 'b', 'a', 'b', 'c', 'e', 'd'};
char sb[] = {'a'};
// squeeze(sa, sb);
printstr(sb);
return 0;
}
你会期望这段代码打印一个“a”,然后退出,对吗?然而,输出是:
$ gcc exercise_2-4.c
$ ./a.out
aababced
但是如果我通过注解来禁用“sa”数组的定义,则会按预期打印:
gcc exercise_2-4.c
./a.out
a
我知道这不是疯狂的事情,这是有原因的,但我真的很想知道。
1条答案
按热度按时间xzv2uavs1#
当你在边界外访问数组时,你调用了undefined行为(UB)。你的程序行为不能从C语言的Angular 来确定。
你需要自己使用null终止:
或使用 * 字符串文字初始化 *