首页 > 解决方案 > 用clang中的大括号括起来的列表初始化的char数组中的尾随符号是什么?

问题描述

#include <stdio.h>

int main(int argc, const char *argv[]) {
  char name1[] = {'f','o','o'};
  char name2[] = "foo";
  printf("%s\n", name1);
  printf("%s\n", name2);
  return 0;
}

运行上面的代码会导致:

foox\363\277\357\376
foo
Program ended with exit code: 0

那么,这两个初始化器有什么区别呢?

标签: arraysc

解决方案


name1是三个字符的数组{'f', 'o', 'o'}

name2是一个由四个字符组成的数组{'f', 'o', 'o', '\0'}

printf("%s", ...)需要一个以空字符结尾的数组。因为name1不是,所以您开始取消引用超出数组末尾的字符,这些字符可能具有传统的未定义行为。


推荐阅读