>我只想打印字符串的第一个字符作为字符串(%s格式说明符(,这会导致分段错误。 但是当我使用 %c 格式说明符时,它工作正常。 为什么会这样?
#include<stdio.h>
#include<string.h>
int main()
{
char *str = "Feasible" ;
printf("%s",*str);
return 0;
}
发生分段错误有什么完美的理由吗?我的代码中的分段错误在哪里?
发生分段错误是因为您的字符串是 char *,即指向 char 的指针。当您现在传入 *str 时
printf ("%sn", *str);
将 str 指向的 char 值(字符串中的第一个字符(传递给 printf。Printf 期望获取指向字符串的第一个字符的指针,并尝试访问给定的内存位置,然后导致分段错误。
对于格式说明符 "%s"
,printf
需要一个指向字符数组的指针;换句话说,提供的值被解释为内存地址。现在请注意,表达式*str
正在取消引用指针str
,以便结果是一个字符值,即 71
作为'F'
的 ASCII 表示形式。因此,如果您使用格式说明符"%s"
但提供值71
作为参数,则71
将被解释为内存地址;并且此内存地址很可能超出了允许的寻址空间,因此存在段错误。
相比之下,格式"%c"
有效,因为它需要一个字符值,如71
(或'F'
(。
%s
用于打印字符串(通过指向第一个字符的指针(。
%c
用于打印单个字符(通过其 ASCII 值(。
如果使用*str
is 表示 str
指向的第一个字符的值,所以需要 %c
。