动态分配的char

2 c++

int main()

{
   char *second= new char("hello");
   char *first="hi";
   char third[]="new";
}
Run Code Online (Sandbox Code Playgroud)

我是c ++的新手,并不真正理解char是如何工作的,为什么第一个产生编译器错误,以及这三种声明方式的差异,以及以特定方式声明它的强度和好处.

谢谢

嗯,正如有人提到第二种形式是只读的,为什么我可以改变它.假设我有以下代码

 int main()

{
   char *second= new char("hello");
   char *first="hi";
   char third[]="new";
   first="world";
}
Run Code Online (Sandbox Code Playgroud)

上面的代码仍会执行,为什么会这样?,如果我想读取输入但不知道字符串的大小,那么哪种形式更好?

Joh*_*itb 13

我知道

"abc"
Run Code Online (Sandbox Code Playgroud)

在某处分配静态存储,这将持续整个程序的生命周期.您无法写入该存储,因此C++为其提供了类型char const[N](N个常量字符的数组).现在,以下内容使指针指向该存储

char *first = "hi";
Run Code Online (Sandbox Code Playgroud)

由于丢弃了a const,因此不推荐使用这种初始化指针的方式.它的工作原理只是为了保持与C的向后兼容性,其中字符串文字没有const类型(但仍然是只读的).请改为选择以下内容

char const *first = "hi";
Run Code Online (Sandbox Code Playgroud)

在constrast,过去的方式,你已经证明复印件字符串文字的内容到一个数组,这将是可写的,并尺寸使字符串文字只是适合它.

char third[] = "new";
Run Code Online (Sandbox Code Playgroud)

如果在函数中执行此操作,那么作为所有变量,当您离开其范围时,该数组将被清除.现在,你展示的第一种方式是不同的.它动态创建一个角色.你可以像这样初始化它

char *c = new char('A');
Run Code Online (Sandbox Code Playgroud)

因为这是动态发生的,所以你需要明确地告诉编译器什么时候应该释放内存

delete c;
Run Code Online (Sandbox Code Playgroud)

但是你不能用字符串文字初始化字符.你可能想到的是动态创建存储,用字符串文字初始化.这是不可能的new.初始化动态数组的唯一形式是将其清零,但不能使用字符串文字或其他数组的内容直接初始化.对于这种使用形式,new很少需要直接这样做.如果需要,可以通过创建正确大小的动态数组,然后将字符串文字中的字节复制到该缓冲区来实现.

char *c = new char[sizeof "hello"]; // sizeof "hello" will give 6
std::strcpy(c, "hello");

delete[] c; // delete[] is for deleting dynamic arrays
Run Code Online (Sandbox Code Playgroud)

请记住,这是非常低级的,我建议你使用字符串

std::string s = "hello"; // s.size() gives you its size
Run Code Online (Sandbox Code Playgroud)

它完全为您管理内存.连接,索引和那些东西也可用.