当常量字符串赋值给常量字符指针时会发生什么?
what happen when constant string assigned to constant character pointer?
当常量字符串赋值给常量字符指针(或字符指针)时会发生什么?例:
const char* p="String";
编译器如何以及在哪里获取这个数组。堆内存?和
有什么不同?char* p="String";
谢谢。
当常量字符串赋值给常量字符指针(或字符指针)时会发生什么?
const string本身没有任何变化:指向它的指针被赋值给p
,仅此而已。
编译器如何以及在哪里获取这个数组。堆内存吗?
它不带它去任何地方。String的数据保持在原来的位置,这是特定于编译器的事情。
和:
有什么不同?char* p="String";
根据c++版本和/或编译器设置,编译器将拒绝将文字赋值给非const的程序,或者警告您不赞成的转换。如果您试图使用const
声明修改p[...]
的内容,编译器将阻止您。如果您尝试在没有const
的情况下做同样的事情,程序可能会编译,但它会在运行时导致未定义的行为。
字符串字面量"String"
是const char
的静态数组,在你的程序中的某个地方,当你的操作系统设置可执行文件时,可能被放置在地址空间的只读部分。
当你赋值const char *p = "String"
时,p
被初始化为指向const char
数组的指针。所以*p
就是'S'
, p[1]
就是't'
,等等。
当您分配char *p = "String"
时,那么您的编译器应该拒绝它(也许您没有足够的诊断级别集?)如果你告诉编译器不管怎样都接受它,那么你就有一个指向(可修改的)char
的指针指向字符串字面值。如果您随后尝试通过该指针进行写操作,则不会得到编译器错误,相反,您可能会在运行时看到以下两个问题之一:
- (如果编译器/链接器将字符串文字放入只读内存中)引发一个信号,指示内存访问冲突(类unix系统上的
SIGSEGV
)。 - (如果字符串字面值在可写内存中)同一字符串字面值的其他用法被修改,因为编译器被允许将它们都指向相同的存储。
相关文章:
- #定义c-预处理器常量..我做错了什么
- 什么时候在C++中返回常量引用是个好主意
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- 返回常量对象引用 (getter) 和仅返回字符串有什么区别?
- C 中的常量限定符和 C++ 中的常量限定符有什么区别?
- 常量公共成员有什么问题?
- 空指针常量 (nullptr)、空指针值和空成员指针值之间有什么区别?
- 什么时候可以使用常量装饰调用我的重载函数?
- 使用什么代替"静态常量 TCHAR *"
- 常量字符*的性质是什么?
- 初始化不是整数的巨大常量多维数组的最佳方法是什么?
- 第二个常量在运算符函数中做什么?
- 常量成员和没有setter的私有成员之间有什么区别
- 什么是常量指针常量引用类型的参数?(const X* const & p)
- C++:允许临时对象调用非常量成员函数的设计理念是什么?
- 从模块导出全局常量的正确方法是什么?
- 有没有办法声明一个公共静态常量,该常量将使用 constexpr 在源文件中定义(有什么区别)?
- 有什么区别 - 常量 int x = 5000;和常量整数 x = 50'00;在C++?
- 出于什么原因,有必要将常量左值引用绑定到右值?
- 什么是可变常量?