我只想打印字符串的第一个字符,作为字符串(%s格式说明符),它会导致分段错误。但是,当我使用%c格式说明符时,它工作正常。为什么会这样?
#include<stdio.h>
#include<string.h>
int main()
{
char *str = "Feasible" ;
printf("%s",*str);
return 0;
}
是否存在发生分段错误的完美原因?我的代码中的分段错误在哪里?
答案 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
。