gpt4 book ai didi

c - c中的获取和malloc

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

在 github 上的某个地方我看到了以下代码

char *p=malloc(1);
gets(p);
printf(p);

我尝试了同样的方法,发现它有效。无论我输入多长的字符串,它都会被存储并且不会出现段错误。怎么运行的?我只给了它 1 个字节。

另外,当我输入 free(p); 时,它会给出奇怪的输出。

最佳答案

该代码是教科书示例,说明了为什么自 2011 年标准起,gets 已从标准库中删除。这是一个恶意软件漏洞。

gets 从标准输入读取字符序列,直到看到换行符,然后将该序列存储到从地址 p 开始的缓冲区中。 gets 不知道目标缓冲区有多大,如果输入序列比缓冲区大小可容纳的长度长,那么 gets 会很乐意将这些多余的字符存储到紧随缓冲区之后的内存,可能会导致各种困惑。

您分配了一个全部 1 字节宽的缓冲区。当您调用 gets 时,它将输入的第一个字符写入该缓冲区,然后将任何其他输入(加上零值终止符)写入紧随缓冲区之后的未分配堆内存。

在这种特定情况下,没有任何重要的内容被覆盖,因此您的代码看起来可以正常运行。然而,在另一种情况下,此代码可能会导致其他数据损坏或导致运行时错误。

写入超过缓冲区末尾的行为是未定义;编译器不必警告您任何事情,编译后的代码可以执行任何操作,从彻底崩溃到执行病毒,再到按预期工作。

所以,

  1. NEVER NEVER NEVER NEVER NEVER 使用 gets。曾经。在任何情况下。甚至在玩具代码中也没有。就像我说的,它不再是标准库的一部分。

  2. C 将资源管理的所有负担都放在程序员身上 - 缓冲区不会自动增长以容纳额外的输入,也没有任何自动垃圾收集来清理不再被引用的动态内存。

  3. C 不会保护你不做愚蠢的事情 - 该语言假设你始终知道自己在做什么。

关于c - c中的获取和malloc,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44096835/

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