当前位置: 首页 > 知识库问答 >
问题:

c/c中gcc编译器是否保证将指向const数据的全局const指针放在单独的只读节中?

穆商震
2023-03-14

给定全局(或静态局部)变量的以下定义:

static const <type>* const ptr = {&var1, &var2, ...};

,我可以依赖这样一个事实吗,即ptr和初始化程序列表中的数据都将被放置到生成的目标文件的单独只读部分(即它不会被放置到. data或包含非const变量的类似部分)?

问题仅与所有架构/平台(至少存在只读内存的那些架构/平台)通用的 gcc c/c 编译器行为有关。它并不意味着任何平台,处理器,操作系统,链接器,启动运行时,库等。

请不要问我要做什么。我知道我在做什么。如果我提供的信息不足以回答,那么问题必须被视为特定的问题,一般的答案是“不”。我已经阅读了这个主题非常接近的问题答案:

类型限定符对存储位置的影响
如何在 C 中实现只读内存?
“const”只是意味着只读还是更多?
为什么编译器允许你在这里“编写”一个const变量?
GCC C (ARM) 和指向结构字段
memcpy 的常量指针,以及指向常量数据的目标指针

但是我没有找到确定而直接的答案。

共有1个答案

呼延聪
2023-03-14

根据stackoverflow线程,常量变量存储在C中的哪里?它是特定于实现的。就我个人而言,我甚至不会相信所有海湾合作委员会港口都是以同样的方式实施的。例如,这就是AVR端口引入“progmem”属性的原因。

所以根据你的

不要问我在做什么,如果没有足够的信息,答案是“不”

态度,我想在这里说:答案是“不”,没有便携式的方式来保证这样的事情。事实上,即使你指示编译器和链接器把它放在类似“只读部分”的东西中。如果此部分位于 RAM 中,谁将阻止对此部分的写入访问权限?

 类似资料:
  • 概念 在我们了解了指针的基本概念之后,接下来我们来看一下指针和C中给我们提供的关键字中的类型修饰符它们之间的关系。指针就是存储地址的一种特殊变量。那这个变量跟我们的修饰符之间还有哪些更深层次的符号限制呐?我们在实际开发过程中,经常会运用修饰符,把指针的这种限制范围更明确的告诉给用户,通过不同修饰符告诉给用户指针的具体属性。 指针变量也是一个变量,它可以改变存储的地址,指向一个地方再指向另外一个地方

  • 问题内容: 我是Java菜鸟。我已经掌握了将C / C ++指针转换为Java引用的概念,并且进展相当顺利。 我打了一段有指针的代码(即* ptr)。我需要取消引用指针并更改其指向的指针的值(即 ptr =&newthing;) 在Java中这似乎要困难得多。是否有人对如何解决此问题有任何想法?快速谷歌搜索什么都没有。 这是C ++中的代码示例。我想在Java中获得类似的工作,但是ptr_to_p

  • C++ 类 & 对象 一个指向 C++ 类的指针与指向结构的指针类似,访问指向类的指针的成员,需要使用成员访问运算符 ->,就像访问指向结构的指针一样。与所有的指针一样,您必须在使用指针之前,对指针进行初始化。 下面的实例有助于更好地理解指向类的指针的概念: #include <iostream> using namespace std; class Box { public:

  • C++ 数组 您可以先跳过本章,等了解了 C++ 指针的概念之后,再来学习本章的内容。 如果您对 C++ 指针的概念有所了解,那么就可以开始本章的学习。数组名是一个指向数组中第一个元素的常量指针。因此,在下面的声明中: double balance[50]; balance 是一个指向 &balance[0] 的指针,即数组 balance 的第一个元素的地址。因此,下面的程序片段把 p 赋值

  • 在print语句中:(假设整数大小为4字节) 让arr的内存位置为1000 arr 1——给出1016(即下一行内存) 我理解了逻辑,但我无法理解编译器如何将 arr标识为“指向4整数数组的指针”,并且 即使在增量之前两者都指向相同的地址(1000)