You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言中为何printf打印字符串用char*变量而非解引用后的*s?

为什么访问字符串时用指针变量名正常,解引用后程序崩溃?

先看你的代码示例:

#include <stdio.h>

void test(char * s,char * b){
    printf("%s\n",s);
    //printf("%s\n",*s); this crashes it
    printf("%c\n",*b);
}

int main(){
    char s[]="string";
    char b='b';
    char * pointerb=&b;
    char * pointerstring=&s;
    test(pointerstring,pointerb);
}

核心原因是**printf的格式符对参数类型有严格要求**:

  • %s格式符要求传入的是指向字符串起始位置的char*类型指针。它会从这个地址开始,逐个读取字符直到遇到'\0'终止符才停止。第5行的s就是char*类型,指向字符串"string"的首地址,完全符合要求,所以能正常输出整个字符串。
  • 第6行的*s是对指针s的解引用,得到的是字符串的第一个字符's'(对应的ASCII值是115)。此时把这个char类型的值传给%s,printf会错误地把它当作一个内存地址来访问——115这个地址属于程序无权访问的内存区域,直接触发内存访问错误,导致程序崩溃。
  • 再看%c格式符,它要求传入的是char类型的值。对指针b解引用*b得到字符'b',刚好匹配%c的要求,所以能正常输出。

另外补充个小细节:代码里char * pointerstring=&s;可以简化成char * pointerstring = s;,因为数组名s本身就代表数组首元素的地址,&s是整个数组的地址,虽然能隐式转换成char*,但直接用s更符合C语言的规范写法。

内容的提问来源于stack exchange,提问作者EZ Connie

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 11:25:31