我正在创建一个项目,我需要创建一个任意长度的字符串并将所有字符设置为特定字符。为什么使用memset手动设置字节时字符串缩短?
设置字节的例子:
char str[i];
memset(str, '*', i);
str[i] = '\0';
这似乎工作至今,但是当我最后一行更改为str[i + 1] = '\0';
,我的输出是由一个缩短。
任何人都可以解释为什么发生这种情况?
我正在创建一个项目,我需要创建一个任意长度的字符串并将所有字符设置为特定字符。为什么使用memset手动设置字节时字符串缩短?
设置字节的例子:
char str[i];
memset(str, '*', i);
str[i] = '\0';
这似乎工作至今,但是当我最后一行更改为str[i + 1] = '\0';
,我的输出是由一个缩短。
任何人都可以解释为什么发生这种情况?
str[i] = '\0';
和
str[i + 1] = '\0';
是因为C语言不检查数组边界不确定的行为。
C11标准:
J.2未定义behavor
- 数组下标超出范围,即使对象是与所述给定标显然可访问(如在左值表达式 a [1] [7]给出了声明int a [4] [5])(6.5.6)。
随着str[i]
和str[i + 1]
您正在访问的str
范围之外。这是undefined behaviour。
如果需要i
长度的数据(不包括终止空字节),您的阵列str
必须具有用于i + 1
元件空间以容纳空终止。另一方面,如果您不使用str
作为C字符串(例如,使用任何期望以空字符结尾的字符串的标准C库函数),那么您不需要在所有。
'str [i + 1]'不在界限内。 'str [i]'也不是。你声明这个数组具有'i'元素,其索引从'0'到'i-1'。 – Ryan
请提供[mcve]。 – rustyx
请注意,做'int i = 42; char str [i];'使用名为“Variable Length Arrays”的语言元素,它只能从C99获得,并且已经成为C11的可选项。 (根本不支持C++), – alk