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

C语言中无法解引用通过函数传递的char*数组问题求助

段错误原因及修复方案

你的代码触发段错误的核心问题是类型转换不匹配,导致指针解引用时访问了非法内存:

  1. 你在main里定义的a是char* a[2],这是一个存储char指针的数组,它的本质类型是char**(指向char指针的指针)。
  2. 但在arg函数中,你把传入的void* args强制转换成了char*——这完全搞错了类型:char*是指向单个字符的指针,而你实际传入的是指向指针数组的指针。
  3. 当你执行printf("%s", arr[0])时,arr[0]会取arr地址偏移0个char长度的内容,也就是把原数组第一个指针的地址值(比如0x400600)当成单个char读取,然后printf会把这个char值当成字符串指针去访问,直接触发段错误。

修复后的代码

void arg(const void* args) {
    // 转换为正确的类型:指向char指针数组的指针
    char** arr = (char**) args;
    printf("%s ", arr[0]);
    printf("%s\n", arr[1]);
    return;
}

int main (void) {
    char* a[2] = {"Hello", "World!"};
    arg((void*)a);
    return 0;
}

补充说明:

  • 多线程函数(比如pthread_create)要求入口函数参数为void*,所以你用void*传参的思路是对的,关键是在函数内部要转换回原参数的真实类型。
  • printf("%s")需要接收字符串指针(char*),修复后arr[0]和arr[1]就是对应字符串的指针,符合printf的参数要求。

内容的提问来源于stack exchange,提问作者Mario Olcina

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 20:57:16