代码如下。我之所以使用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!"};
并且您需要显式地将类型为const
void的指针强制转换为类型const char **
,例如
const char*const* arr = static_cast<const char * const *>( args );