gpt4 book ai didi

c++ - 关于字符串文字和动态分配的两个基本 C++ 问题

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

这两个是等价的吗?

char * aString = "这是一个字符串。";

char aString[] = "这是一个字符串。";

据我了解,C++ 按地址存储字符串,因此指针获得了一个有效地址。我假设字符串也存储为 char 类型?但是它怎么知道要为字符串分配多少内存呢?通常,char 数组需要预设数组大小。我相信 [] 类型数组在编译前由编译器计算。字符串文字指针也会发生这种情况吗?

关于我的第二个问题,这两者有什么区别:

整数部分;

int * someNumber = new int;

第二个应该是动态分配。如果我对这个概念的理解是正确的,它会在读取声明后立即分配内存。但是标准声明中会发生什么?基本上,我需要了解动态分配与标准声明相比有何优势。

最佳答案

char * aString = "This is a string.";

它使指针 aString 指向包含 "This is a string." 的静态分配的字符数组。该字符串不可 可写,即使指针的类型可能表明您可以写入它。查看下面链接中的答案,了解避免它的原因以及如何做得更好。

char aString[] = "This is a string.";

它正在创建一个类型为 char[18] 的数组。即使你用声明符告诉它 aString 有一个类型 char[],它实际上是在定义一个具有完整类型的数组——也就是说,为它定义了长度大批。那是因为它是直接初始化的,编译器可以推断出数组的大小。数组 可写的。您可以自由更改其中的字符。我试图在这个答案中明确区分:C++ strings: [] vs. *

int someNumber;

它是在堆栈上创建的整数变量。它初始化。它具有自动存储持续时间:超出范围(从函数返回,退出循环......)将释放它的内存。您当然可以随意写入。

int * someNumber = new int;

它是一个指向动态分配的整数的指针。 int 初始化。当指针超出范围时,内存不会被释放。也就是说,当您的函数返回时,内存仍会存在。

关于c++ - 关于字符串文字和动态分配的两个基本 C++ 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/433850/

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