#include<stdio.h>
int main()
{
char str[10];
scanf("%[^\n]", str);
printf("%s\n", str);
}
编译时,输入为“subhash das india”。 输出与 subhash das india 相同。 我想知道字符串如何存储在内存中,因为 str 大小为 10 并且给定输入的大小大于 10。
最佳答案
前十个字符存储在数组中,其余的字节存储在内存中数组后面的字节中。您不知道这些字节中应该存储什么,但是您用字符串 "s india"
覆盖它们。 。这不好。尽管它在这种情况下可能有效,但当您再次运行该程序时,它甚至不可能与不同的编译器/在不同的系统上工作。
printf()
不关心你覆盖了什么,它只会在字符串中搜索终止空字节,该字节恰好出现在数组末尾之后的某个位置。在您从函数返回之前,意外行为不太可能生效(在本例中为 main()
),这可能会出现段错误,或者使用 main()
中声明的一些其他变量。恰好已被 scanf()
覆盖.
请注意,您的程序的行为完全未定义。允许格式化您的硬盘。允许将您的计算机的备份保存到 NSA。可以下载一个漂亮的小程序,当您下次尝试进行网上银行时,该程序会自动重定向您的浏览器。这些都是真正的危险,像您给出的代码一样是最容易利用的安全漏洞的核心。
如果你想安全,请使用 POSIX-2008 函数:getline()
读取整行和 asprintf()
替换 sprintf()
的使用和strcat()
。标准 C 库的 GNU 实现还允许您使用格式 "%as"
与 scanf()
为要读取的字符串分配足够的内存,但这不是标准的一部分。
关于c - 当输入字符串大小较大时字符串数组的存储,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23845807/