【问题标题】:segmentation fault with scanf for const char*const char * 的 scanf 分段错误
【发布时间】:2012-05-17 05:47:59
【问题描述】:

我已将变量声明为

const char* mode;

我想从用户那里获取mode 的值。当我使用

scanf("%s",mode)

我遇到了分段错误。有什么建议吗?

【问题讨论】:

    标签: c string pointers constants


    【解决方案1】:

    应该scanf 通话中收到警告。

    通过声明

    const char* mode;
    

    您将mode 设为指向 const char 的指针,这意味着您无法修改mode 指向的数据。

    然后你调用:

    scanf("%s",mode);
    

    试图修改mode指向的数据。

    gcc 对此发出警告:

    warning: writing into constant object (argument 2) [-Wformat]
    

    所以mode 需要是一个指向 non-const 字符的指针。而且,正如其他人所提到的,它需要指向一些实际数据,以便scanf 可以修改该数据。这可能是导致您的分段错误的原因,但由于您没有向我们展示 mode 是如何初始化的,所以很难说。

    mode 通常会指向数组的第一个字符。那么该阵列必须有多大?由于您使用 scanf"%s" 格式,它可能不够大。 scanf("%s", mode)stdin 读取一个以空格分隔的字符串到mode 指向的缓冲区中。您无法避免会溢出缓冲区的输入。

    (如果这是一个初学者的练习,你可以暂时忽略缓冲区溢出问题;只需让mode 指向一个相当大的缓冲区,并避免提供很长的输入。)

    【讨论】:

    • +1:花时间详细回答和解释,而不是像我一样只给出答案。
    【解决方案2】:

    您需要为指针分配内存以便能够用它做一些有意义的事情。声明为:

    #define MAX_LENGTH 256
    char *mode = malloc(MAX_LENGTH);
    

    另外,如果需要的内存不是太大,最好有堆栈分配: 简单来说,

    char mode[MAX_LENGTH];
    

    【讨论】:

    • 嗨,Als,但我需要使用 const char*,因为我将此变量传递给函数。我不能在这里只使用 char*。
    • 您应该能够将char* 传递给任何需要const char* 的对象,但反之则不行。
    【解决方案3】:

    分段错误通常是试图访问 CPU 无法物理寻址的内存。

    那是因为你没有为你的变量分配内存。
    注意:
    但某些 c 编译器(如 Turbo C++)允许您在不分配内存的情况下这样做。

    【讨论】:

    • 即使是 Turbo C 代码也会遇到指针未初始化的问题,但在 x86 实模式 中,它不会导致段错误:某些随机内存已损坏。
    猜你喜欢
    • 2012-01-27
    • 1970-01-01
    • 1970-01-01
    • 2013-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多