【问题标题】:Constant Pointers vs Pointers to Constant Strings常量指针与指向常量字符串的指针
【发布时间】:2020-03-25 18:22:22
【问题描述】:

我知道如果我使用指向常量字符串的全局指针:

const char *h = "hello";

变量h存储在可写数据段中。但是如果我使用

指向字符串的常量指针

char * const h = "hello";

或指向常量字符串的常量指针

const char * const h = "hello";

那么 h 将存储在哪里?

【问题讨论】:

  • 请记住,常量指针必须在声明时初始化,因为没有其他机会为它们赋值。
  • 给定const char * const h = …,C 实现可以将h 存储在只读部分或可写部分中。如果声明出现在函数内部,实现通常会将其存储在堆栈中。由于堆栈的性质,它必须是可写的。给定声明const char *h = …,如果编译器可以确定h 永远不会被修改,它可能仍将h 存储在只读部分中。
  • char * const h = "hello"; 不再在 C++ 中编译,因为我认为是 C++11。
  • 编译器实现依赖:stackoverflow.com/questions/1576489/…

标签: c++ c string pointers constants


【解决方案1】:

首先,你一直说指向 string 的指针,这是不准确的。它们都是指向一个char的指针,而这个char是字符串的开头。

对于您的问题,h 是常量指针时将存储在哪里?它将存储在 RAM 的只读部分中。就像任何常量变量一样,比如 const int。

【讨论】:

  • const h 是否存储在只读内存中取决于实现。
【解决方案2】:

c++ 语言没有指定不同存储区域之间的区别,除了这两个变量具有静态存储持续时间。在一个系统上,它们可能存储在同一个区域,而在另一个系统上则存储在不同的区域。

鉴于在后一种情况下变量为 const,语言实现可能会选择使用受保护而不会被覆盖的内存区域。

【讨论】:

    猜你喜欢
    • 2014-02-23
    • 1970-01-01
    • 2020-10-23
    • 2013-08-02
    • 2015-06-22
    • 1970-01-01
    • 2013-01-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多