C语言 为什么这段代码打印一个无关的字符数组的内容?

7ivaypg9  于 2023-10-16  发布在  其他
关注(0)|答案(1)|浏览(115)

我正在做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

我知道这不是疯狂的事情,这是有原因的,但我真的很想知道。

xzv2uavs

xzv2uavs1#

当你在边界外访问数组时,你调用了undefined行为(UB)。你的程序行为不能从C语言的Angular 来确定。
你需要自己使用null终止:

char sa[] = {'a', 'b', 'a', 'b', 'c', 'e', 'd', 0};
   char sb[] = {'a', 0};

或使用 * 字符串文字初始化 *

char sa[] = "ababced";
   char sb[] = "a";

相关问题