我对 C++ 中的字符串文字几乎没有怀疑。
char *strPtr ="Hello" ;
char strArray[] ="Hello";
现在 strPtr 和 strArray 被认为是字符串文字。
根据我的理解,字符串文字存储在只读内存中,因此我们无法修改它们的值。
我们做不到
strPtr[2] ='a';
and strArray[2]='a';
以上两种说法都应该是非法的。
编译器在这两种情况下都应该抛出错误。
编译器将字符串文字保存在只读内存中,因此如果我们尝试修改它们,编译器会抛出错误。
const 数据也被认为是只读的。
是否以相同的方式处理字符串文字和常量数据?
我可以使用 const_cast 从字符串文字中删除常量可以改变它的值吗?
字符串文字究竟存储在哪里? (在程序的数据部分)
最佳答案
不,他们不是。字符串文字是您在代码中看到的内容。例如, "Hello"
。 strPtr
是指向文字的指针(现在已在可执行文件中编译)。请注意,它应该是 const char *
;您不能根据 C 标准合法地删除 const
并在使用它时期望定义的行为。 strArray
是一个包含文字拷贝的数组(在可执行文件中编译)。
不,不应该。这两个声明是完全合法的。由于情况,第一个是未定义的。但是,如果它们是指向 const char
的指针,那将是一个错误。
据我所知,字符串文字的定义方式可能与其他文字和常量的定义方式相同。但是,也有区别:
// 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(例如大多数 Nintendo DS 程序),那么常量数据可能在 RAM 中。但是,写入仍然未定义。对于普通的 C++ 程序员来说,const 数据的位置应该无关紧要。
关于c++ - 字符串文字,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/718477/