c - 当输入字符串大小较大时字符串数组的存储

标签 c arrays string

#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/

相关文章:

c - C中的strtok和strtok_r有什么区别?

arrays - Delphi如何释放动态实例化按钮数组?

python - 在 Python 中将字符串转换为整数

c - fclose() 之后管道 "closing"

c - 无法使用 ipv6 连接 2 台机器(TCP 服务器客户端)

计算在 Linux 中 I2C 上写入和读取之间的延迟

c# - 将控件数组添加到 aspx 页面

javascript - 如何提高Javascript/破解代码算法的性能?

ruby-on-rails - 提取变量值 '_'之前的部分

c# - String.Trim() 删除的内容超出需要?