C语言如何向函数传递字符串?报错排查及无地址传参方法问询
代码运行失败原因
第一个示例代码
void fun(char *p) { printf("%s",*p); } int main() { fun("hello"); }
错误点:
printf的%s格式控制符要求传入char*类型的字符串首地址,但是代码里传入的是*p,也就是对指针p解引用后得到的单个字符'h',本质是ASCII码整数。程序会把这个整数当作内存地址去读取字符串,触发非法内存访问,导致程序崩溃。- 补充:这个示例的传参逻辑本身是合法的,C语言中字符串字面量
"hello"本身就是指向只读存储区中字符串首地址的char*类型常量,传入fun函数的过程符合类型要求,仅printf调用处存在错误。
第二个示例代码
void fun(char *p) { printf("%s",*p); } int main() { char a = 'c'; fun(a); }
错误点:
- 传参类型不匹配:形参
p要求接收char*类型的指针,你传入的a是char类型的单个字符,编译器会把字符'c'的ASCII码值直接当作地址赋值给p,这个地址几乎都是未分配的非法内存地址。 - 和第一个示例一样,
printf调用时%s传入了*p的字符值,同样会触发非法内存访问。
不传递地址传入字符串的可行性
C语言中不存在不传递地址就能向函数传入字符串的实现方式。
C语言的字符串本质是末尾带有\0结束符的字符数组,C语言语法不支持直接将整个数组作为值参数传递,数组作为参数传入函数时会自动隐式转换为指向数组首元素的指针,所有字符串传参的本质都是传递首地址。
内容的提问来源于stack exchange,提问作者Aman Jain
相关产品推荐
相关产品推荐

