2014-01-07 199 views
28

有如下所示的代码。我有问题通过参数。从'const char *'到'char *'的无效转换

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

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

//更多代码

printfunc(num,addr,data.str().c_str()); 

我得到的错误

从 '为const char *' 到 '字符*' 无效的转换。

初始化的功能

上述线的参数3 '空隙Printfunc(INT,字符*,字符*)' 的参数3。该函数被调用如下所示

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

请让我知道如果我需要更改任何初始化。

+2

编译器希望将char *流更改为const char *流 – marcinj

+0

下面的答案处理编译错误,但您还需要为传递给'strcpy'的目标缓冲区分配一些内存 - 您不能仅仅通过NULL指针作为目标参数 – mathematician1975

+1

调用'data.str().c_str()'可能会有令人惊讶的结果。 – Chad

回答

37

好,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())); 
12

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

速战速决:尽量铸造printfunc(num,addr,(char *)data.str().c_str());

虽然上述可能工作,但它是未定义的行为,并且不安全。

下面是使用模板一个更好的解决方案:

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

第一个问题是使用强制转换去除常量。第二个问题是使用C风格的演员。 –

+1

谢谢,我生锈了。我会更新我的解决方案。 OP参考@ Dietmar的回复 – Louis93

+0

@ Louis93是的,你的快速修复工作。但它如何不安全? – user2333234

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 *。

相关问题