2017-10-15 34 views
-1

我正在创建一个项目,我需要创建一个任意长度的字符串并将所有字符设置为特定字符。为什么使用memset手动设置字节时字符串缩短?

设置字节的例子:

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

这似乎工作至今,但是当我最后一行更改为str[i + 1] = '\0';,我的输出是由一个缩短。

任何人都可以解释为什么发生这种情况?

+6

'str [i + 1]'不在界限内。 'str [i]'也不是。你声明这个数组具有'i'元素,其索引从'0'到'i-1'。 – Ryan

+0

请提供[mcve]。 – rustyx

+0

请注意,做'int i = 42; char str [i];'使用名为“Variable Length Arrays”的语言元素,它只能从C99获得,并且已经成为C11的可选项。 (根本不支持C++), – alk

回答

1
str[i] = '\0'; 

str[i + 1] = '\0'; 

是因为C语言不检查数组边界不确定的行为。

C11标准:

J.2未定义behavor

  • 数组下标超出范围,即使对象是与所述给定标显然可访问(如在左值表达式 a [1] [7]给出了声明int a [4] [5])(6.5.6)。
1

随着str[i]str[i + 1]您正在访问的str范围之外。这是undefined behaviour

如果需要i长度的数据(不包括终止空字节),您的阵列str必须具有用于i + 1元件空间以容纳空终止。另一方面,如果您不使用str作为C字符串(例如,使用任何期望以空字符结尾的字符串的标准C库函数),那么您不需要在所有。

相关问题