C语言中无法解引用通过函数传递的char*数组问题求助
段错误原因及修复方案
你的代码触发段错误的核心问题是类型转换不匹配,导致指针解引用时访问了非法内存:
- 你在
main里定义的a是char* a[2],这是一个存储char指针的数组,它的本质类型是char**(指向char指针的指针)。 - 但在
arg函数中,你把传入的void* args强制转换成了char*——这完全搞错了类型:char*是指向单个字符的指针,而你实际传入的是指向指针数组的指针。 - 当你执行
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
相关产品推荐
相关产品推荐

