【问题标题】:Why does char * malloc give me a seg fault with scanf? [closed]为什么 char * malloc 给我一个 scanf 的段错误? [关闭]
【发布时间】:2012-10-07 18:34:29
【问题描述】:
char * input = (char*)malloc(256);

scanf("%s", input);

段错误。为什么?我在 C 中使用字符串时遇到了很多麻烦,但我觉得一切都在这里完成。我什至从一个 100k+ SO 用户那里得到了一个例子。

【问题讨论】:

  • 不要从malloc 转换结果。
  • 你检查过那个输入 != null 吗?
  • 你得到多少输入?越界访问是候选。
  • 如果你没有#include <stdlib.h>如果你的编译器没有执行C99规则,如果char*和@ 987654325@ 在您的系统上有不同的大小,那么很可能在malloc() 上进行转换是问题所在。在这种情况下,编译器会假定malloc() 返回int 结果;它会将int 值转换为char*。但是你最好把时间花在修复代码上(即使它碰巧对你有用,这也是错误的)。添加#include 指令,删除演员表,确保您不要给scanf 提供太多输入,然后告诉我们会发生什么。
  • @Aerovistae:坦率地说,如果您“有足够的能力知道与给定错误无关的内容”,您就不会寻求我们的帮助。请从一开始就向我们提供完整的信息,这样我们就不必浪费时间想知道您犯了哪些未显示的错误。我们不知道你的能力。

标签: c string segmentation-fault scanf


【解决方案1】:

该错误可能由以下原因引起:

  • malloc() 未能分配任何内存,请对照 NULL 检查结果。
  • 由 scanf 缓冲区溢出,超过 256 个字符。
  • 忘记包含<stdlib.h>,然后对malloc 的结果进行类型转换。更多信息here

【讨论】:

    【解决方案2】:

    您需要确保缓冲区足够大,包括足够的空间用于字符串末尾的尾随 NUL(0 字节)。否则,您会遇到可能导致段错误的缓冲区溢出。

    【讨论】:

    • 而且由于scanf("%s", input); 从标准输入中读取任意数量的字符,您无法可靠地确保缓冲区足够大。 scanf"%s" 格式与 gets() 一样危险(已从语言中删除)。但是行为可以很好地定义如果你没有输入太多的字符。
    猜你喜欢
    • 2016-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-22
    • 2015-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多