字符 *p=“abc”;printf(“%s”, *(p+1));为什么会给出分段错误?

char *p="abc"; printf("%s", *(p+1)); //gives segmentation fault why?

提问人:Rajat Chakraborty 提问时间:10/30/2023 更新时间:10/30/2023 访问量:107

问:

为什么下面的代码会出现分段错误?

#include <stdio.h>

int main() {
    // Write C code here
    char *p="abc";
    printf("%s %s \n", p , p+1);// abc bc
    printf("%s", *(p+1));//segmentation fault
    return 0;
}

这里为什么 *(P+1) 给出分割 faublt?

我想知道为什么会出现分段错误?

数组 C 指针

评论

6赞 Ken White 10/30/2023
因为格式规范需要一个以 null 结尾的字符串,而您没有提供该字符串。printf%s
4赞 HolyBlackCat 10/30/2023
您是否忘记启用编译器警告?我明白了.warning: format specifies type 'char *' but the argument has type 'char'
0赞 Lundin 10/30/2023
我们能否将所有这些“错误的格式说明符”问题作为简单的错别字来关闭?
0赞 Rajat Chakraborty 10/30/2023
好了,现在明白了。谢谢大家。
1赞 HolyBlackCat 10/30/2023
以前没见过那个。我没有看到启用警告或自定义标志的按钮......这里有一个更好的方法,它允许你直接控制编译器标志:gcc.godbolt.org/z/off9v3ebT

答:

7赞 greg spears 10/30/2023 #1

您会遇到分段错误,因为表达式 *(p+1) 引用了数组偏移量 1 处的字符,而不是字符串。但是 printf() 语句中的 %s 需要一个与单个字符非常不兼容的字符串。结果是一些未定义的行为和分段错误。

下面是一个解决方法——我们要求 printf() 打印一个带有 %c 的字符:

#include <stdio.h>

int main() {
    // Write C code here
    char *p="abc";
    printf("%s %s \n", p , p+1);// abc bc
    printf("%c", *(p+1));  /* corrected*/
    return 0;
}

输出 -- 可运行代码如下

abc bc 
b

评论

3赞 chux - Reinstate Monica 10/30/2023
更像是“printf() 语句中的 %s 需要指向字符串的指针