从'const char *'到'char *'的无效转换

时间:2014-01-07 23:34:26

标签: c++

拥有如下所示的代码。传递参数时遇到问题。

stringstream data;
char *addr=NULL;
strcpy(addr,retstring().c_str());

retstring()是一个返回字符串的函数。

//more code
printfunc(num,addr,data.str().c_str());

我收到错误

  

从'const char *'无效转换为'char *'。

     

在函数的参数3上初始化'void Printfunc(int,char *,char *)'的参数3

在上面一行。该函数调用如下所示

void Printfunc(int a, char *loc, char *stream)

如果我需要更改任何初始化,请告诉我。

3 个答案:

答案 0 :(得分:44)

好吧,data.str().c_str()会产生char const*,但您的函数Printfunc()想要char*。根据名称,它不会更改参数,只是打印它们和/或使用它们来命名文件,在这种情况下,您应该修改您的声明

void Printfunc(int a, char const* loc, char const* stream)

替代方案可能是将char const*变为char*,但最好修改声明:

Printfunc(num, addr, const_cast<char*>(data.str().c_str()));

答案 1 :(得分:13)

string::c.str()返回const char *类型的字符串here

快速解决方法:尝试投射printfunc(num,addr,(char *)data.str().c_str());

虽然上述内容可能有效,但它是未定义的行为,并且不安全。

这是使用模板的更好的解决方案:

char * my_argument = const_cast<char*> ( ...c_str() );

答案 2 :(得分:1)

首先是这段代码

char *addr=NULL;
strcpy(addr,retstring().c_str());

无效,因为您没有在要复制retstring()的地方分配内存.c_str()。

至于错误信息,那就足够清楚了。表达式data.str()。c_str()的类型是const char *,但函数的第三个参数声明为char *。您不能将const char *类型的对象分配给char *类型的对象。函数应该将第三个参数定义为const char *,如果它不改变第三个参数指向的对象,或者你可能不传递const char *类型的参数。