字符数组空间不足时编译器是否会自动添加空终止符?
问题解答
- 首先明确C语言标准的统一规定:
- 字符串字面量
"check"本身包含6个字符:5个可见字符+末尾隐式的'\0',但当你用它初始化长度为5的char数组时,编译器只会拷贝前5个可见字符到数组中,不会自动追加'\0'到数组末尾,这一行为是所有符合C标准的编译器统一实现的,不存在差异。 - 你的代码里str数组的合法访问范围只有下标0~4,这5个位置存储的就是
'c'、'h'、'e'、'c'、'k',不存在'\0'。
- 你观察到循环停止的原因:
- 你访问
str[5]的时候已经越界了,这个位置不属于str数组的分配空间,只是刚好这块栈内存上的值是0,才让你误以为数组末尾有'\0',这属于典型的未定义行为。 - 这个现象完全是随机的:换编译器、换编译优化等级、甚至同个程序多次运行,都有可能出现数组后方内存非0的情况,此时循环会继续越界读取内存,直到读到0值、或者触发内存访问错误导致程序崩溃,没有任何可预测性。
内容的提问来源于stack exchange,提问作者Gendozz
相关产品推荐
相关产品推荐

