将const char *分配给char *

时间:2019-12-10 08:33:13

标签: c++ string pointers

#include <cstring>

char* str0;
const char* str1 = "abc";


// assign str1 to str0
strcpy(str0, str1);    // syntax correct, but run time error
str0 = str1;           // syntax error, cannot convert const char* to char*
string n_str = str1;
str0 = n_str;          // syntax error, cannot convert ...


cout << str0 << endl;  // expected output: abc

我想在运行时(编译后)使str0与str1相同,但我不知道该怎么做。对于str0 = str1;的情况,我不明白为什么它不起作用,因为str0指向空,而str1指向常量字符串文字,因此,如果我现在使str0指向str1指向的内容,应该没问题,但事实并非如此。那么有什么办法解决吗?

4 个答案:

答案 0 :(得分:5)

std::string str0;
const std::string str1 = "abc";

// assign str1 to str0
str0 = str1;

cout << str0 << endl;  // output: abc

如果您坚持使用C:

char* str0;
const char* str1 = "abc";

str0 = malloc(strlen(str1) + 1);
// if you use a c++ compiler you need instead:
// str0 = (char*) malloc(strlen(str1) + 1);

strcpy(str0, str1);

// and free after use
// if you use C++ this will not help much
// as pretty much any exception above will cause your code to get out of `free`,
// causing a memory leak
free(str0);

如果您坚持使用糟糕的C ++:

char* str0;
const char* str1 = "abc";

str0 = new char[strlen(str1) + 1];

strcpy(str0, str1);

// and delete after use
// this will not help much
// as pretty much any exception above will cause your code to get out of `delete`,
// causing a memory leak
delete(str0);

请阅读有关RAII的信息,以了解为什么所有带有手动内存管理的解决方案都不好:cppreferencewiki

答案 1 :(得分:2)

让我们一次看看一个问题

strcpy(str0, str1);

strcpy将str1指向的字符复制到str0指向的内存中。 str1指向“ abc”,但str0不指向任何内容,因此会出现运行时错误。我建议在各处使用std :: string,这样您就不必自己管理内存了。

str0 = str1;  

str0的类型为char *,str1的类型为const char *。 const限定符指示编译器不允许对该特定变量进行数据修改(超出const的简化作用,有关更深入的解释,请使用您喜欢的搜索引擎,并且您应该能够找到许多解释const的文章)。如果您能够为str0分配相同的指针,那么您将破坏const合约; str0是可修改的。

string n_str = str1;

这是有效的,因为std :: string重载了赋值运算符并接受const char指针作为右手值。

str0 = n_str;

n_str的类型为std :: string,而str0为char *,没有重载运算符允许这样做。如果您确实希望从std :: string中获取原始点,则可以使用c_str()方法,它将返回一个const char *-我强烈建议您这样做,除非您必须将其传递给仅接受该函数的函数const char *。

答案 2 :(得分:1)

复制strings是一项昂贵的操作。但是将strings从一个地方移到另一个地方是有效的。

丢弃const

str0 = (char*) str1;

或使用std::string类模板库来管理字符串。 std::string拥有存储字符串值的字符缓冲区。字符是string对象的一部分。 cont char*存储此类字符缓冲区的地址,但不拥有它。

c_str返回指向空终止字符串的const char*。当您要传递内容时,它很有用。

std::string str1 = "abc";
char* str0;

strcpy(str0, str1.c_str());
printf(str0);

答案 3 :(得分:0)

const是该类型的一部分,因此,您可以将其“抛弃”。这被认为是不好的做法,但是您应该将const视为原始程序员的强烈建议,而不是对其进行修改。

const char * str1 = "abc";
char * str2 = (char*) str1;
相关问题