为什么数组中的旧值仍然存在?

时间:2018-06-09 19:03:34

标签: c arrays string

请解释此输出。问题与scanf相同。如何每次重新初始化阵列?
输入:

create-drop

输出:

HelloWorld
Tech

代码:

eo  
Tech
TW

2 个答案:

答案 0 :(得分:0)

请更正您的指示。你可能想要使用2个,3个,4个空格,但1个看起来不对。我没有看到使用string.h库。

数组未清除,但0..3字符替换为新字符,位置4上的字符为\0。这就是为什么你可以从这个数组中第5位的先前输入值读取字符。

答案 1 :(得分:0)

在C中,字符串存储为null-terminated个字符数组。这意味着有很多方法可以表示相同的字符串:忽略第一个空字节后的字符数组中的所有内容,只要涉及字符串的值。

当第一个gets来电显示为HelloWorld时,它会将字符'H'存储在c[0]'e'c[1],...,{ 'd'中的{1}}和c[9]中的0(这是空字节,而不是'0')。 c[10]c[11]的内容不变。

当第二个c[1023]来电显示为gets时,它会将Tech中的字符'T'存储在c[0]中的'e',{{1}在c[1]中,'c'中的c[2]'h'中的0。 c[3]c[4]的内容不变。特别是,c[5]仍然具有第一次c[1023]调用设置的值c[5]

如果您习惯使用高级语言,您可能会期望W分配新存储,或者执行看起来像字符串访问的操作可以保证您实际访问字符串,但这些都不是是的。

正如您可能会猜到的那样,您将一个字符数组传递给gets,它只会写入该字符数组,而不会分配新的存储空间。当gets读取一个4字节的字符串时,它会写入4字节的字符串加上终止的空字节,并且它不会触及这5个字节之后的任何内容。实际上,gets甚至不知道数组的大小(这就是为什么gets在实践中几乎无法使用并且已从当前版本的C语言中删除的原因:如果输入一行这对于数组来说太长了,它会覆盖内存中数组之后的任何内容。

gets访问位置5的数组gets的元素。这恰好在字符串之外,但这与数组访问的操作方式无关。它是数组访问权限,而不是字符串访问权限。 C本身并没有真正的字符串:它用字符数组伪造它们。字符串操作函数将其参数视为字符串(即它们只查找第一个空字节)。但是数组访问只是一个数组访问,并且程序员不能访问字符串或数组,超出范围。