为什么分段故障在字符串而不是字符?

时间:2017-04-14 19:00:39

标签: c segmentation-fault

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

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

是否存在发生分段错误的完美原因?我的代码中的分段错误在哪里?

3 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:1)

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

相比之下,

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

答案 2 :(得分:0)

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

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

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