嗨 在我的代码中,我有一个存储在 char* 中的字符串,我只想将字符串的一部分复制到另一个 char*。 比如说,
char * str1 = "I am new to c++";
// I am creating new char pointer
char * str2 = new char[20];
int startpos = 5;
int destpos = 0;
// i am checking for the white space from the start posistion
while(str1[startpos]!=' '){
str2 [destpos++] = str1[startpos++];
}
printf("n New String is %s",str2);
// now i am deleting the char*
delete[] str2;
delete[] str1;
我正在使用这种操作,此代码有时正常运行并导致 seg 错误(双重释放或损坏)。
有人请告诉我是什么原因。
首先,永远不要将字符串文字分配给指向非常量字符的指针:
char* str1 = "I am new to c++"; // bad
char const* str1 = "I am new to c++"; // good
其次,永远不要delete[]
字符串文字。
如果您想要理智,请使用std::string
:
std::string str1("I am new to c++");
int startpos = 5;
std::string str2;
for (auto it = str1.begin() + startpos; it != str1.end(); ++it) {
if (*it == ' ')
break;
str2.push_back(*it);
}
std::cout << "n New String is " << str2;
有关详细信息,请参阅std::string
。
每当你使用new
和delete
时,你都做错了™。
delete[] str1;
是未定义的行为,因为 str1 是一个字符串文字,而不是使用新分配的 char 数组 (new char[N]
初始化的 char 指针。这可能就是您的程序以分段错误结束的原因。
正如其他答案所建议的那样,无论如何,您可能都应该使用std::string
。
由于这是C++,为了上帝的爱,请使用std::string。
(P.S.,它失败了,因为"str1"被分配了只读内存的地址;它没有动态分配new[]或malloc。因此,它不应该传递给 delete[] 或 free())。
delete[] str1;
- 这是给你分段错误的行。 str1
声明为常量字符串文本。无需为str1
调用delete
使用strncpy如下方式复制字符串,
memset(str2, 0, strlen(str2));
strncpy(str2 + destpos, str1 + startpos, sizeof(strlen(str1) - startpos - 1));