【问题标题】:what happen when constant string assigned to constant character pointer?将常量字符串分配给常量字符指针时会发生什么?
【发布时间】:2015-08-06 15:29:37
【问题描述】:

当常量字符串分配给常量字符指针(或字符指针)时会发生什么?例如:

const char* p="String";

编译器如何以及在何处获取此数组 .. 堆内存? 和它有什么不同:

char* p="String";

谢谢。

【问题讨论】:

  • 不同之处在于第 2 版已弃用,不应使用。
  • @Borgleader 其实是ill-formed in C++11...
  • @Barry 感谢您的澄清,但重要的是“你不应该做第二个”

标签: c++ pointers


【解决方案1】:

当常量字符串分配给常量字符指针(或字符指针)时会发生什么?

const 字符串本身没有发生任何事情:指向它的指针被分配给p,仅此而已。

编译器如何以及在何处获取此数组 .. 堆内存?

它不会把它带到任何地方。字符串的数据保留在原来的位置,这是编译器特定的东西。

和它有什么不同:char* p="String";

根据 C++ 版本和/或编译器设置,编译器将拒绝将文字分配给非常量的程序,或警告您不推荐使用的转换。 如果你尝试使用const 声明修改p[...] 的内容,编译器会阻止你。如果您尝试在没有const 的情况下执行相同操作,则程序可能会编译,但它会在运行时导致未定义的行为。

【讨论】:

  • 好。但我不明白一个唯一的指针如何保存一个字符数组,但是一个指针只保存一个指向数组中第一个元素的地址。那么常量字符串保存在哪里?!
【解决方案2】:

字符串文字"String" 是您程序中某处的const char 的静态数组,当您的操作系统设置可执行文件时,它可能放置在地址空间的只读部分中。

当您分配const char *p = "String" 时,p 会使用指向该数组const char 的指针进行初始化。所以*p'S'p[1]'t',等等。

当您分配char *p = "String" 时,您的编译器应该拒绝它(也许您的诊断级别设置不足?)。如果您告诉编译器无论如何都接受它,那么您有一个指向(可修改的)char 的指针指向字符串文字。如果您随后尝试通过此指针进行写入,则不会出现编译器错误,而是可能会在运行时看到以下两个问题之一:

  1. (如果编译器/链接器已将字符串文字放入只读内存中)会发出一个信号,指示内存访问冲突(在类 Unix 系统上为SIGSEGV)。
  2. (如果字符串字面量在可写内存中)相同字符串字面量的其他用途会被修改,因为允许编译器将它们全部指向同一个存储。

【讨论】:

    猜你喜欢
    • 2011-07-02
    • 2020-03-25
    • 2021-11-21
    • 1970-01-01
    • 2020-10-12
    • 2016-01-10
    • 2014-08-02
    • 1970-01-01
    • 2013-01-01
    相关资源
    最近更新 更多