gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 21:38:38 25 4
gpt4 key购买 nike

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

HelloWorld
Tech

输出:

eo  
Tech
TW

代码:

#include<stdio.h>  
#include<string.h>
int main()
{ char c[1024]; int i,d=1;
gets(c);
printf("%c%c\n",c[d],c[d+5]);
gets(c);
puts(c);
printf("%c%c\n",c[0],c[4+d]);
return 0;
}

最佳答案

在 C 中,字符串存储为 null-terminated字符数组。这意味着有多种方法可以表示同一个字符串:就字符串的值而言,第一个空字节之后的字符数组中的所有内容都将被忽略。

当第一个 gets 调用读取 HelloWorld 时,它将字符 'H' 存储在 c[0] 中>、c[1] 中的 'e'、...、c[9] 中的 'd' 以及c[10] 中的 0(这是一个空字节,而不是 '0')。 c[11]c[1023] 的内容保持不变。

当第二个 gets 调用读取 Tech 时,它将字符 'T' 存储在 c[0] 中>、c[1] 中的 'e'c[2] 中的 'c''h'c[3] 中,0 在 c[4] 中。 c[5]c[1023] 的内容保持不变。特别是,c[5] 仍然具有由第一个 gets 调用设置的值 W

如果您习惯了高级语言,您可能会期望 gets 分配新的存储空间,或者执行看起来像字符串访问的操作来保证您实际上正在访问该字符串,但是这些都不是真的。

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

c[5] 访问数组 c 位置 5 处的元素。这恰好位于字符串之外,但这与数组访问的操作方式无关。这是数组访问,而不是字符串访问。 C 本身并没有真正的字符串:它用字符数组来伪造它们。字符串操作函数将它们的参数视为字符串(即它们只查找第一个空字节)。但数组访问只是数组访问,程序员可以决定不要越界访问字符串或数组。

关于c - 为什么数组中的旧值仍然存在?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50777573/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com