使用memset手动设置字节时,为什么缩短字符串?

时间:2017-10-15 08:15:32

标签: c

我正在开发一个项目,我需要创建一个任意长度的字符串,并将所有字符设置为特定字符。

设置字节的示例:

char str[i];
memset(str, '*', i);
str[i] = '\0';

到目前为止这似乎有效,但是当我将最后一行更改为str[i + 1] = '\0';时,我的输出会缩短一个。

任何人都可以解释为什么会这样吗?

2 个答案:

答案 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终止它。