dynamically allocated char

3
int main()

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

我是c++的新手,不太理解char的工作原理,为什么第一个会报编译错误,以及这三种声明方式的区别,以及在特定方式下声明它的优势和强度。

谢谢

嗯,有人提到第二种形式是只读的,那我为什么可以更改它呢?假设我有以下代码

 int main()

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

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

2个回答

14

了解

"abc"

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

char *first = "hi";

由于这种方式会丢失const,因此指针初始化的这种方式已经被废弃。它之所以能够正常工作,只是为了保持与C语言的向后兼容性,因为在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

它完全为您管理内存。拼接、索引等功能也是可用的。


1
我唯一想要补充的是关于char和char的小知识点。从读者的问题来看,他好像对char和char/C风格字符串有些困惑。 - kbyrd
很好的总结。 你不觉得新手过于依赖std::string存在问题吗?这使得C++太像Java了,当你必须使用char*时就会迷失方向。 - toto

1

让我们试着用代码来解释:

// your code
char *first="hi";
// this is the memory location of the string, assigned by the compiler
// sizeof(first) == sizeof(char*) == 4 (usually, lets not get into this right now)
char *first = 0x12345;


// your code
char third[]="new";
// means, the following:
char third[4];
third[0] = 0x6E; // ascii code of 'n'
third[1] = 0x65; // ascii code of 'e'
third[2] = 0x77; // ascii code of 'w'
third[3] = 0x00; // strings in C end with NULL
// note that sizeof(third) is still sizeof(char*), but this 
// time you statically allocated sizeof(char)*4 for the whole array

更多阅读材料:


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接