我正在开发一个项目,我需要创建一个任意长度的字符串,并将所有字符设置为特定字符。
设置字节的示例:
char str[i];
memset(str, '*', i);
str[i] = '\0';
到目前为止这似乎有效,但是当我将最后一行更改为str[i + 1] = '\0';
时,我的输出会缩短一个。
任何人都可以解释为什么会这样吗?
答案 0 :(得分:1)
str[i] = '\0';
和
str[i + 1] = '\0';
是未定义的行为,因为C语言不检查数组绑定。
C11标准:
J.2未定义的行为
- 数组下标超出范围,即使某个对象显然可以使用给定的下标访问(如左值表达式) a [1] [7]给出了a [4] [5])(6.5.6)中的声明。
答案 1 :(得分:1)
使用str[i]
和str[i + 1]
,您可以访问str
的范围之外。这是undefined behaviour。
如果您需要i
个数据长度(不包括终止空字节),则数组str
必须有i + 1
个元素的空间才能容纳空终止符。
另一方面,如果你没有使用str
作为C字符串(例如,使用任何期望空终止字符串的标准C库函数),那么你不需要null终止它。