gpt4 book ai didi

c - Malloc 分配超出范围的内存地址

转载 作者:太空宇宙 更新时间:2023-11-04 05:05:09 24 4
gpt4 key购买 nike

我有下面的代码片段,它分配了超出范围的内存:

char *str1 = (char *) malloc(sizeof(char) * BUF_SIZE);
printf ("str1 = ");
scanf("%s", &str1);
int n = strlen(str1);

最初我在 strlen() 中遇到了一个Segmentation Fault。在玩过 gdb 之后,我开始知道 str1 位于一个越界的地址。下面显示的是 gdb 输出。

(gdb) print str1
$1 = 0x636261 <Address 0x636261 out of bounds>

注意:断点设置在调用strlen() 的行。此外,BUF_SIZE 设置为 #define BUF_SIZE 10

如有任何帮助,我们将不胜感激。谢谢:)

最佳答案

您应该将 str1 而不是 &str1 传递给 scanf()

scanf() 期望 char *"%s" 格式;你传递一个 char * 的地址。这不会带来幸福。

因为 BUF_SIZE 非常小——只有 10,你说——你需要使用:

if (scanf("%9s", str1) != 1)
…process error or EOF…

这将防止缓冲区溢出。每次使用 %s 时都应指定大小(除非您将 POSIX 修饰符 %ms 用于 scanf() ,但随后规则全部更改)。如果不这样做,scanf() 可以在您不知情的情况下写入字符串变量的范围之外。

您还应该检查 malloc() 是否成功。总是。每次。


请注意,使用 GCC 和 -Wall(或 -Wformat)进行编译会指出您的方法的错误。如果您使用的是 GCC,则应始终使用 -Wall(最好也使用 -Wextra - 我使用的选项比这更多)进行编译以获得更好的错误报告。

对于包含您的代码的文件,GCC 说:

warning: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘char **’ [-Wformat=]

或在使用 -Werror 编译时出现“错误”,我认为这是很好的做法。

我顺便注意到 GDB 告诉我您可能在小端(例如 Intel)机器上输入了 abc 作为字符串。值 0x636261 对应于此。您覆盖了 malloc() 返回的指针,因为您传递了 str1 的地址而不是 str1 中的值——导致内存损坏。

关于c - Malloc 分配超出范围的内存地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28173704/

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