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

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);
}

错误点:

  1. 传参类型不匹配:形参p要求接收char*类型的指针,你传入的a是char类型的单个字符,编译器会把字符'c'的ASCII码值直接当作地址赋值给p,这个地址几乎都是未分配的非法内存地址。
  2. 和第一个示例一样,printf调用时%s传入了*p的字符值,同样会触发非法内存访问。

不传递地址传入字符串的可行性

C语言中不存在不传递地址就能向函数传入字符串的实现方式。
C语言的字符串本质是末尾带有\0结束符的字符数组,C语言语法不支持直接将整个数组作为值参数传递,数组作为参数传入函数时会自动隐式转换为指向数组首元素的指针,所有字符串传参的本质都是传递首地址。


内容的提问来源于stack exchange,提问作者Aman Jain

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.21 00:15:01