C++ 将常量char*分配给char* #包括 字符*str0; 常量字符*str1=“abc”; //将str1分配给str0 strcpy(str0,str1);//语法正确,但运行时错误 str0=str1;//语法错误,无法将常量字符*转换为字符* 字符串n_str=str1; str0=n_str;//语法错误,无法转换。。。 cout

C++ 将常量char*分配给char* #包括 字符*str0; 常量字符*str1=“abc”; //将str1分配给str0 strcpy(str0,str1);//语法正确,但运行时错误 str0=str1;//语法错误,无法将常量字符*转换为字符* 字符串n_str=str1; str0=n_str;//语法错误,无法转换。。。 cout,c++,string,pointers,C++,String,Pointers,const是类型的一部分,因此,您可以将其“丢弃”。这被认为是不好的做法,但您应该将const看作是原始程序员的强烈建议,而不是修改它 #include <cstring> char* str0; const char* str1 = "abc"; // assign str1 to str0 strcpy(str0, str1); // syntax correct, but run time error str0 = str1; // syntax

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

#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

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

#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
如果您坚持使用糟糕的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);
请阅读有关RAII的内容,了解为什么所有手动内存管理解决方案都不好:

如果您坚持使用糟糕的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);

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

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

丢弃
常量

str0=(char*)str1;
或者使用
std::string
类模板库来管理字符串
std::string
拥有存储字符串值的字符缓冲区。字符是
字符串
对象的一部分
contchar*
存储这样一个字符缓冲区的地址,但不拥有它

c_str
返回指向以null结尾的字符串的
const char*
。当您想要传递内容时,它很有用

std::string str1=“abc”;
字符*str0;
strcpy(str0,str1.c_str());
printf(str0);

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

丢弃
常量

str0=(char*)str1;
或者使用
std::string
类模板库来管理字符串
std::string
拥有存储字符串值的字符缓冲区。字符是
字符串
对象的一部分
contchar*
存储这样一个字符缓冲区的地址,但不拥有它

c_str
返回指向以null结尾的字符串的
const char*
。当您想要传递内容时,它很有用

std::string str1=“abc”;
字符*str0;
strcpy(str0,str1.c_str());
printf(str0);

让我们一次看一个问题

strcpy(str0,str1);
将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*

的函数。让我们一次看一个问题

strcpy(str0,str1);
将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*

的函数,那么
strcpy
应该在哪里复制字符串?哪儿也去不了?您应该首先为要指向的
str0
分配一些内存。或者
strdup
或者首先分配内存。赋值不起作用,因为它是常量,不能通过赋值来删除它。文本字符串(如
“abc”
)实际上是常量字符数组。为什么需要指向这样一个数组的非常量
char
指针?你需要解决的真正问题是什么?现在这太复杂了。@Someprogrammerdude最初的问题是,有一个类的成员数据类型为char*,还有一个构造函数。构造函数有一个const char*类型的参数,cons
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);