我最近一直在学习C++,并意识到C++中的字符串必须是常量,而在C中则不是.这里有一个例子.以下代码在C中有效,但在C++中无效:

char* str = "Hello World";

为了在C++中执行相同的操作,必须使用以下语句:

const char* str = "Hello World";

有人能解释一下为什么吗?

推荐答案

在Christian Gibbons的回答上再进一步...

在C语言中,像"Hello W或ld"这样的字符串存储在char的数组中,这样它们在程序的整个生命周期内都是可见的.字符串文字supposed是不可变的,一些实现将它们存储在只读内存段中(这样,试图修改文字的内容将触发运行时错误).有些实现不会,并且try 修改文本的内容可能不会触发运行时错误(甚至可能看起来像预期的那样工作).C语言定义将行为保留为"未定义",以便编译器可以随意处理它认为合适的情况.

在C++中,字符串文字存储在const char的数组中,因此任何修改文字内容的try 都会触发诊断at compile time.

正如克里斯蒂安指出的,const个关键词原本不是C.的一部分,但是它最初是C++的一部分,它使得使用字符串文字更加安全.

记住,const关键字does not的意思是"将这个存储在只读存储器中",它只表示"这个东西可能不是赋值的目标".

还要记住,除非它是sizeof或一元*运算符的操作数,或者是用于在声明中初始化字符数组的字符串文字,否则"T的N元素数组"类型的expression将被转换("Decay")为"指向T的指针"类型的表达式,并且表达式的值将是数组的第一个元素的地址.

在C++中,当您编写

const char *str = "Hello, w或ld";

字符串的第一个字符的address存储为str.您可以将str设置为指向different字符串文字:

str = "Goodbye cruel w或ld";

但是您cannot要做的是修改字符串的内容,如下所示

str[0] = 'h';

strcpy( str, "Something else" );

C++相关问答推荐

malloc实现:判断正确的分配对齐

自定义应用程序上的日志(log)轮换问题

减法运算结果的平方的最快方法?

如何跨平台处理UTF-16字符串?

C lang:当我try 将3个或更多元素写入数组时,出现总线错误

是什么让numpy.sum比优化的(自动矢量化的)C循环更快?

如何在CANbus RX/TX FIFO起始地址寄存器(ATSAME 51)的特定地址初始化数组?

关于scanf()和空格的问题

将字符串数组传递给C中的函数:`str[dim1][str_size]`vs`*str[dim1]`

从C中的函数返回静态字符串是不是一种糟糕的做法?

如何在zOS上编译共享C库

如何在C中处理流水线中的a、n命令?

传递给函数的 struct 中的数组

浮点正零何时不全为零?

根据输入/输出将 C 编译过程分为预处理、编译、汇编和链接步骤

在链表中插入一个值

在 C23 之前如何对空指针使用nullptr?

如何根据当前舍入方向将float转换为int?

char* 上的 free() 被 valgrind 识别为无效

当最大成员是原始类型时,联合是否可以大于最大成员?