字符串常量保存在哪个段?该怎么解决
字符串常量保存在哪个段?
对于字符串常量保存的地方一直有点疑惑。网上搜的说是放在进程的数据段,那就应该是跟全局变量放在一起。那为什么全局变量值可以修改,而字符串常量不可修改?编译器是怎样区分全局变量和字符串常量的,怎么保证字符串常量不可修改?
------解决方案--------------------
我昨天也想过这个问题 数据段是不止一个段的 例如汇编中.data .const
------解决方案--------------------
.rdata
------解决方案--------------------
c语言中叫字符串字面量吧 与c++的字符串常量的叫法不同
C/C++ 中对象的生存期按照其存储性质可分为三类:静态存储期(static storage duration)、自动存储期(automatic storage duration)以及动态存储期(dynamic storage duration)。相应地,对象可根据存储期性质分为静态对象、自动对象和动态对象三种。
字符串字面量是静态对象,所以在程序运行期间会一直存在。
修改字符串字面量的行为是无定义的
下面的操作都试图修改字符串字面量中的第一个字符从而改变字符串字面量,所以其结果是无定义(Undefined)的:
”hello”[0] = ‘A’; /* Undefined */
char* p = “hello”; *p = ‘A’; /* Undefined */
使用了无定义行为的程序是错误的;避免在程序中出现无定义行为是程序员的责任。
------解决方案--------------------
------解决方案--------------------
这个是和实现有关的,比如《UNIX环境高级编程》中就有一节提到UNIX系统的内存布局是怎么样的,包括了字符串字面量存放在哪个数据段,但是其他实现就会不同。内存镜像怎么安排的和实现有关。
单纯从c语言的角度来说,只要知道生命周期,作用域什么的。
对于字符串常量保存的地方一直有点疑惑。网上搜的说是放在进程的数据段,那就应该是跟全局变量放在一起。那为什么全局变量值可以修改,而字符串常量不可修改?编译器是怎样区分全局变量和字符串常量的,怎么保证字符串常量不可修改?
------解决方案--------------------
我昨天也想过这个问题 数据段是不止一个段的 例如汇编中.data .const
------解决方案--------------------
.rdata
------解决方案--------------------
c语言中叫字符串字面量吧 与c++的字符串常量的叫法不同
C/C++ 中对象的生存期按照其存储性质可分为三类:静态存储期(static storage duration)、自动存储期(automatic storage duration)以及动态存储期(dynamic storage duration)。相应地,对象可根据存储期性质分为静态对象、自动对象和动态对象三种。
字符串字面量是静态对象,所以在程序运行期间会一直存在。
修改字符串字面量的行为是无定义的
下面的操作都试图修改字符串字面量中的第一个字符从而改变字符串字面量,所以其结果是无定义(Undefined)的:
”hello”[0] = ‘A’; /* Undefined */
char* p = “hello”; *p = ‘A’; /* Undefined */
使用了无定义行为的程序是错误的;避免在程序中出现无定义行为是程序员的责任。
------解决方案--------------------
------解决方案--------------------
这个是和实现有关的,比如《UNIX环境高级编程》中就有一节提到UNIX系统的内存布局是怎么样的,包括了字符串字面量存放在哪个数据段,但是其他实现就会不同。内存镜像怎么安排的和实现有关。
单纯从c语言的角度来说,只要知道生命周期,作用域什么的。