以下给定的程序存在一些疑问。任何讨论都有助于理解内部。
#include <iostream>
using namespace std;
int main() {
// your code goes here
char* ptr = new char[11];
ptr = "helloworld";
cout << ptr;
int* ptr1 = new int[2];
//ptr1 = {12, 24};
cout << ptr1;
return 0;
}
答案 0 :(得分:5)
你问题的核心是为什么&lt;&lt; operator在一个case中输出一个字符串,在另一个case中输出一个地址这是来自它的c语言遗产,其中没有“真正的”字符串类型。在c / c ++中,char *和char []被唯一地处理,通常被假定为'字符串'。假定其他类型的数组是该类型的数组。因此,在输出char *时,&lt;&lt;假设你想要一个字符串输出,而使用int [],它输出数组的地址而不是它的内容。简单地说,char []和char *在许多输出函数中被视为特殊情况。
我可以看到你对编译器处理源代码的方式也有一些困惑。考虑:
char* ptr = new char[11];
ptr = "helloworld";
此代码分配11个内存的char并将ptr设置为该分配的地址。下一行创建一个常量“helloworld”,它被分配和初始化,并将ptr设置为该内存的地址。你有两个内存位置,一个有11个未初始化的字符,一个初始化为“helloworld \ 0”。
答案 1 :(得分:0)
您的代码存在严重问题,这是内存泄漏。您分配内存并将其分配给ptr
,但随后重新分配以使其指向其他位置。如果您希望内存包含字符串,则必须将其复制到已分配的内存中。
语言不允许使用“文字数组”,除非在声明中初始化数组。