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
相关产品推荐
相关产品推荐

