【问题标题】:why segmentation fault in string but not char? [closed]为什么字符串中有分段错误而不是字符? [关闭]
【发布时间】:2017-04-14 19:00:39
【问题描述】:

我只是想打印字符串的第一个字符,作为字符串(%s 格式说明符),它会导致分段错误。但是当我使用 %c 格式说明符时,它工作正常。为什么会这样?

#include<stdio.h>
#include<string.h>
int main()
{
    char *str = "Feasible" ;
    printf("%s",*str);
    return 0;
}

是否有任何完美的理由导致分段错误发生?我的代码中的分段错误在哪里?

【问题讨论】:

  • str 代替*str 放入printf("%s",*str);
  • printf("%s",*str); -> printf("%s",str);。并打开你的编译器警告。
  • 不同之处在于%c希望传递实际字符,而不是它的位置,因此间接*str
  • 为什么要将单个字符打印为字符串?
  • @RajeevSingh , str 将打印完整的字符串,而不是单个字符。

标签: c segmentation-fault


【解决方案1】:

发生分段错误是因为您的字符串是一个 char *,一个指向 char 的指针。当你现在传入 *str 时

printf ("%s\n", *str);

您将 str 指向的字符值(字符串中的第一个字符)传递给 printf。 Printf 期望获得指向字符串第一个字符的指针并尝试访问给定的内存位置,这会导致分段错误。

【讨论】:

    【解决方案2】:

    对于格式说明符"%s"printf 需要一个指向字符数组的指针;换句话说,提供的值被解释为内存地址。 现在请注意,表达式*str 正在取消引用指针str,因此结果是一个字符值,即71 作为'F' 的ASCII 表示。 因此,如果您使用格式说明符"%s" 但提供值71 作为参数,那么71 将被解释为内存地址;并且这个内存地址很可能超出了允许的寻址空间,因此出现了段错误。

    相比之下,格式"%c" 有效,因为它需要像71(或'F')这样的字符值。

    【讨论】:

      【解决方案3】:

      %s 用于打印字符串(通过指向第一个字符的指针)。

      %c 用于打印单个字符(通过其 ASCII 值)。

      如果使用*str,则表示str指向的第一个字符的值,所以需要%c

      【讨论】:

        猜你喜欢
        • 2019-10-25
        • 1970-01-01
        • 2017-04-05
        • 1970-01-01
        • 1970-01-01
        • 2017-05-09
        • 2014-12-05
        • 1970-01-01
        • 2014-03-15
        相关资源
        最近更新 更多