首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >字符串字面量

字符串字面量
EN

Stack Overflow用户
提问于 2009-04-05 06:40:37
回答 3查看 4.6K关注 0票数 11

我对c++中的字符串字面值没有什么疑问。

代码语言:javascript
运行
复制
char *strPtr ="Hello" ;
char strArray[] ="Hello";

现在,strPtr和strArray被认为是字符串文字。

据我所知,字符串文字存储在只读内存中,所以我们不能修改它们的值。

我们不能这样做

代码语言:javascript
运行
复制
strPtr[2] ='a';
and strArray[2]='a';

上述两种说法都应该是非法的。编译器在这两种情况下都应该抛出错误。

编译器将字符串保存在只读内存中,所以如果我们试图修改它们,编译器就会抛出错误。

另外,常量数据也被认为是只读的。

字符串字面量和常量数据是否以相同的方式处理?我可以使用const_cast从字符串中删除常量吗?可以改变它的值吗?

字符串文字到底存储在哪里?(在程序的数据部分)

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-04-05 06:46:23

现在,strPtr和strArray被认为是字符串文字。

不,它们不是。字符串文字是你在代码中看到的东西。例如,"Hello"strPtr是指向文字(现在在可执行文件中编译)的指针。注意,它应该是const char *;根据C标准,您不能合法地删除const并期望在使用它时定义行为。strArray是一个包含文字副本(在可执行文件中编译)的数组。

以上两种说法都应该是非法的。编译器在这两种情况下都应该抛出错误。

不,不应该。这两个陈述是完全合法的。由于情况的原因,第一个是未定义的。但是,如果它们是指向const chars的指针,这将是一个错误。

据我所知,字符串文字的定义方式可能与其他文字和常量的定义方式相同。但是,也有一些不同:

代码语言:javascript
运行
复制
// These copy from ROM to RAM at run-time:
char myString[] = "hello";
const int myInt = 42;
float myFloats[] = { 3.1, 4.1, 5.9 };

// These copy a pointer to some data in ROM at run-time:
const char *myString2 = "hello";
const float *myFloats2 = { 3.1, 4.1, 5.9 };

char *myString3 = "hello";  // Legal, but...
myString3[0] = 'j';         // Undefined behavior!  (Most likely segfaults.)

我在这里使用的ROM和RAM是通用的。如果平台只有RAM (例如大多数任天堂DS程序),那么常量数据可能在RAM中。然而,写入仍然是未定义的。对于普通的C++程序员来说,const数据的位置应该无关紧要。

票数 18
EN

Stack Overflow用户

发布于 2009-04-05 06:50:14

代码语言:javascript
运行
复制
char *strPtr ="Hello" ;

定义strPtr一个指向字符的指针,指向一个字符串文字"Hello" --这个指针的有效类型是const char *。不允许通过strPtr对指针对象进行修改(如果您尝试这样做,则调用UB )。这是旧C代码的向后兼容性特性。此约定在C++0x中已弃用。见附件C:

字符串数组更改:字符串字面量使常量字符类型从“

”更改为“const char数组”...

原理:这避免了调用一个不适当的重载函数,因为它可能希望能够修改它的参数。

对原始特征的影响:改变为定义明确的特征的语义。转换困难:简单的语法转换,因为字符串可以转换为char*;(4.2)。最常见的情况是由一个新的但不推荐使用的标准转换处理的:

char* p = "abc"; // valid in C, deprecated in C++

char* q = expr ? "abc" : "de"; // valid in C, invalid in C++

使用范围有多广:有正当理由将字符串字面量视为指向潜在可修改内存的指针的程序可能很少。

代码语言:javascript
运行
复制
char strArray[] ="Hello";

声明的strPtr类型是--它是一个未指定大小的字符数组,其中包含字符串Hello,其中包含空终止符,即6个字符。然而,初始化使它成为一个完整的类型,并且它的类型是6个字符的数组。通过strPtr进行修改是可以的。

字符串文字到底存储在哪里?

已定义实现。

票数 9
EN

Stack Overflow用户

发布于 2009-04-05 09:35:17

较早的C和C++编译器纯粹基于低级编码,无法获得更高的数据保护标准,甚至无法强制执行,通常在C和C++中,您可以编写任何您想要的代码。

如果您知道如何使用地址,您甚至可以编写代码来访问和修改const指针。

虽然C++确实实施了一些编译级别的保护,但在运行时没有保护。当然,您可以访问自己的堆栈,并使用它的值来操作传入const指针的任何数据。

这就是发明C#的原因,因为无论你访问的是什么引用,它都是一个固定的结构,管理所有数据保护规则,并且它有隐藏的指针,不能访问和修改。

主要区别在于,C++只能为您提供编译时保护,而C#即使在运行时也会为您提供保护。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/718477

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档