gpt4 book ai didi

c++ - 动态分配的字符

转载 作者:太空狗 更新时间:2023-10-29 23:29:32 25 4
gpt4 key购买 nike

int main()

{
char *second= new char("hello");
char *first="hi";
char third[]="new";
}

我是 c++ 的新手,并不真正理解 char 是如何工作的,为什么第一个会给出编译器错误,这 3 种声明方式的区别是什么,以特定方式声明它的优势和好处.

谢谢

嗯,正如有人提到的第二种形式是只读的,我为什么要更改它。假设我有下面的代码

 int main()

{
char *second= new char("hello");
char *first="hi";
char third[]="new";
first="world";
}

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

最佳答案

知道了

"abc"

在某处分配静态存储,持续整个程序生命周期。您不能写入该存储,因此 C++ 赋予它类型 char const[N](N 个常量字符的数组)。现在,以下内容指向该存储

char *first = "hi";

由于删除了一个 const,因此不推荐使用这种初始化指针的方式。它的工作原理只是为了保持与 C 的向后兼容性,其中字符串文字没有 const 类型(但仍然是只读的)。更喜欢以下内容

char const *first = "hi";

相比之下,您展示的最后一种方法是将字符串文字的内容复制到一个数组,该数组将是可写的,并且调整大小以使字符串文字正好适合它。

char third[] = "new";

如果您在函数中这样做,那么作为所有变量,当您离开其作用域时,该数组将被清理。现在,您展示的第一种方式有所不同。它动态创建一个角色。你可以像这样初始化它

char *c = new char('A');

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

delete c;

但是你不能用字符串文字来初始化字符。您可能想到的是动态创建存储,并使用字符串文字进行初始化。使用 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

记住这是很底层的,我建议你使用字符串

std::string s = "hello"; // s.size() gives you its size

它完全为您管理内存。也可以使用连接、索引等。

关于c++ - 动态分配的字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/958549/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com