C++ 将非常量带引号的字符串分配给char*?

C++ 将非常量带引号的字符串分配给char*?,c++,pointers,cstring,C++,Pointers,Cstring,是否有任何方法可以将带引号的字符串指定给指针,如下所示,而不将其强制转换为const char* char** p; *p=new char[100]; *p="quoted_string\n"; 上面的问题是p现在是const字符串,我不能从中删除块: delete p[n]; //gives an error--- block_is_valid... 我知道字符串文字,比如L“string”,但我找不到任何解决问题的方法 澄清:我明确表示,我正在寻找一种与所提供的示例中呈现的简单程度相同

是否有任何方法可以将带引号的字符串指定给指针,如下所示,而不将其强制转换为
const char*

char** p;
*p=new char[100];
*p="quoted_string\n";
上面的问题是
p
现在是
const
字符串,我不能
从中删除
块:

delete p[n]; //gives an error--- block_is_valid...

我知道字符串文字,比如
L“string”
,但我找不到任何解决问题的方法

澄清:我明确表示,我正在寻找一种与所提供的示例中呈现的简单程度相同的方法。我知道我可以遍历字符串并复制它,但这不是我想要的

对于那些对
delete
的位置感到困惑的人,我用它来做这样的事情:

while(*p!=char_01) //this is not an example to be taken literally
{delete p; p++;}
使用一个:

然后,可以使用以下命令删除字符:

p.erase(p.begin() + n);

代码的问题在于:

char* p;
p=new char[100];
p="quoted_string\n";
忘记了动态分配的指针,导致
100
字节内存泄漏。此外,不应使用
delete
从C样式字符串中删除字符

我也建议你在进一步做之前,因为你似乎缺少C++ C++的基础知识。

< P> C++:

#include <string>
...
std::string str = "quoted_string\n";
请注意,这些都是任何好书中都包含的基础知识:
还要注意的是,
L“string”
并不是您想象的那样。看一看


丑陋的C风格解决方案,动态分配缓冲区(!!!你真的不想这么做!!!):

#包括
...
char*str=新字符[100];//目标缓冲区
const char*src=“quoted\u string\n”;//指向常量字符串文字的指针

strcpy(str,src);//strlen(src)必须要将带引号的字符串转换为指针,可以执行以下操作: char*p=(char*)“你好,世界”

这会使警告静音,但是,这样做会对编译器撒谎。当你以后写信到那个地区时,你会被咬的

要了解这有多严重,您需要了解大多数工具链默认将文本字符串放在可执行文件的只读部分(.rodata)上,该区域映射为只读,写入该区域会导致保护故障,默认情况下会终止应用程序。因此,为了防止人为错误,编译器很乐意为此生成警告

如果您完全知道自己在做什么,您可以告诉链接器将该文本字符串放在可写部分,或者尝试使用-fno const strings

你写道:

while(*p!=char_01){delete p;p++}

现在我发现对指针、字符串和delete的工作方式缺乏理解。
如果你想操作字符串,使用string类更容易,你会从你喜欢的搜索引擎中得到大量的教程。

你可能想将字符串复制到该数组中,而不是覆盖指针…“但我找不到任何方法来解决我的问题”。真正地strcpy…即使您被允许执行该赋值,并且它以某种方式生成了字符数组的可变副本,
delete
也不会这样做。你应该在你的好书中多读一些。如果代码没有在p[n]处释放内存,那么它会做什么?如果是这样的话,它有什么问题,它是如何证明对指针如何工作缺乏理解的?请解释。delete p将调用delete函数并尝试取消分配p指向的内存,但是,这取决于实现,delete p很可能会由于健全性检查而失败,并且发现的p不是由其分配器/new分配的。(注意:大多数分配器添加前缀元块)。此外,如果幸运的话,尝试检查不存在的元块,删除功能也可能触发页面错误。有人能解释下一票吗?你可以通过再次阅读问题,然后查看答案,特别是最后一句话,找到下一票的解释。
#include <string>
...
std::string str = "quoted_string\n";
char str[] = "quoted_string\n";
#include <cstring>
...
char* str = new char[100];                // destination buffer
const char* src = "quoted_string\n";      // pointer to constant string literal
strcpy(str, src);                         // strlen(src) must be <= 99 
...
delete[] str;