分段引用char数组时出错

sid*_*fan 2 c arrays char segmentation-fault

#include<stdio.h>
int main(void)
{
    char * p= "strings are good";
    printf("%s",*p);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

有人可以告诉我为什么我在这里得到分段错误?

hac*_*cks 8

有人可以告诉我为什么我在这里得到分段错误?

C11:7.21.6格式化输入/输出功能:

如果转换规范无效,则行为未定义.282)如果任何参数不是相应转换规范的正确类型,则行为未定义.

3.4.3

1 使用不可移植或错误的程序结构或错误数据时的未定义行为行为,本国际标准不对此作出任何要求.

2 注意可能的未定义行为包括完全忽略不可预测结果的情况,以及以环境特征(有或没有发出诊断消息)的文档化方式执行转换或程序执行,终止翻译或执行(带有发出诊断信息).

*p是类型的char.%s期望类型的参数char *.这将调用未定义的行为.在这种情况下,一切都可能发生 有时你可能得到预期的结果,有时候不会.这也可能导致程序崩溃或分段错误(这种情况就是这种情况).

因为%s,您需要传递sting/literal的起始地址.

更改

printf("%s",*p);  
Run Code Online (Sandbox Code Playgroud)

printf("%s",p);
Run Code Online (Sandbox Code Playgroud)

  • @sidchelseafan如果要取消引用指针(单个字符),请尝试%c.%s可能期望你提供一个指针,而不仅仅是一个字符的值(这是你解除引用时得到的). (3认同)
  • @sidchelseafan你可能有一个seg错误,因为printf看到`%s`并且正在寻找数据,直到它得到一个标记字符串结尾的空值.但是,当你取消引用它时,你只给了它一个角色,所以它很可能会读过这个角色然后爆炸了. (2认同)