c语言 - 无法取消引用通过函数传递的 char* 数组



代码如下。我之所以使用void * args,是因为这个函数必须在线程程序中使用。它在有线程和没有线程的情况下进行了测试,但在这两个工作流中都不起作用。我对C还很陌生,这对普通程序员来说可能是显而易见的,但即使使用gdb,我也找不到问题所在。

void arg(const void* args) {
char* arr = (char*) args;
printf("%s", arr[0]);
printf("%s", arr[1]);
return;
}
int main (void) {
char* a[2] = {"Hello", "World!"};
arg((void*)a);
return 0;
}

当取消引用args时,上面的代码将segfault。

首先,char* a[2] = {"Hello", "World!"};不是有效的C++。如果您启用警告,您将看到我们需要将a声明为

vvvvv----------------------------------->added const 
const char* a[2] = {"Hello", "World!"}; //VALID

此外,这里不需要向void*投射任何内容。您可以直接声明参数为const char**类型,如下所示:

void arg(const char** args) {

std::cout<<args[0]<<std::endl;
std::cout<<args[1]<<std::endl;
return;
}
int main () {
const char* a[2] = {"Hello", "World!"};
arg(a);
return 0;
}

工作演示

另一种选择是在这里使用std::string而不是字符串文字。


我之所以使用void * args,是因为这个函数必须在线程程序中使用

void arg(const void* args) {
const char*const* ptr = static_cast<const char * const *>( args );
std::cout<<ptr[0]<<std::endl;
std::cout<<ptr[1]<<std::endl;
return;
}
int main () {
//--vvvvv------------------------------------>added const
const char* a[2] = {"Hello", "World!"};
//------v------------------------------------>no need to use cast here
arg(a);
return 0;
}

C版本可以看起来像:

void arg(void* args)
{
const char** arr = args;
printf("%s", arr[0]);
printf("%s", arr[1]);
}

表达式arr[0]arr[1]在强制转换之后具有类型char

char* arr = (char*) args;

因此,至少将转换说明符s与类型为char的对象一起使用

printf("%s", arr[0]);
printf("%s", arr[1]);

不正确。

你的意思似乎是下面的

void arg(const void* args) {
const char** arr = args;
printf("%s", arr[0]);
printf("%s", arr[1]);
}

注意阵列a

char* a[2] = {"Hello", "World!"};

表达式中使用的指针(极少数例外(被隐式转换为CCD_ 15类型的指针。

在C++中,字符串文字数组应使用限定符const声明

const char* a[2] = {"Hello", "World!"};

并且您需要显式地将类型为constvoid的指针强制转换为类型const char **,例如

const char*const* arr = static_cast<const char * const *>( args );

最新更新