首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >类型限定符对存储位置的影响

类型限定符对存储位置的影响
EN

Stack Overflow用户
提问于 2012-10-27 08:36:32
回答 2查看 122关注 0票数 0

正如标题中提到的,type-qualifiers是否会影响存储位置(stackbss等),我并不感到困惑。关于declarator.To的更多描述,我正在考虑以下声明。

代码语言:javascript
复制
int main()
{
   const int value=5;
   const char *str= "Constant String";
}
  • 在上面的代码中,默认的storage-class-specifierauto
  • 因此,假设这些常量在创建时将在stack-frame of main中分配。
  • 通常,对堆栈中不同内存位置的pointers可以自由地修改其中包含的值。
  • 因此,从以上几点来看,可以理解的是,type-qualifier添加了一些逻辑来保留存储的元素的constant性质(如果是这样的话,它是什么?)或者constants存储在read-only-portion of memory.Please中,详细说明这一点。

更详细的例子

代码语言:javascript
复制
#include <stdio.h>
int main(void)
{
  int val=5;
  int *ptr=&val;
  const int *cptr=ptr;

  *ptr=10;  //Allowed
  //*cptr=10; Not allowed

  //Both ptr and cptr are pointing to same locations. But why the following error?
  //"assignment of read-only location ‘*cptr’"

  printf("ptr: %08X\n",ptr);
  printf("cptr: %08X\n",cptr);
  printf("Value: %d\n",*ptr);
}

在上面的示例中,cptrptr都指向相同的位置。但是cptr是指向const type qualified整数的指针。在修改cptr的值时,编译器抛出一个错误为“指定只读位置‘*cptr’”。但是,我能够用修改ptr相同的位置,就像在输出below.Please解释中一样

代码语言:javascript
复制
ptr: BFF912D8
cptr: BFF912D8
Value: 10
EN

回答 2

Stack Overflow用户

发布于 2012-10-27 08:51:23

第一个示例中的

代码语言:javascript
复制
int main()
{
   const int value=5;
   const char *str= "Constant String";
}

将存储变量value和字符串文本的位置留给实现。C标准所保证的就是这些将存储在只读内存中,可以存储在文本段、堆栈或任何地方。

第二个例子中的

代码语言:javascript
复制
 int *ptr=&val;
 const int *cptr=ptr;

当您尝试修改*cptr时,编译器并不关心cptr指出的实际位置是只读的还是可写的。它只关心类型限定符const,它认为cptr指向的位置是只读的。

另一个变体:

代码语言:javascript
复制
    const int i = 5;
    p = &i;
   *p = 99;

在这种情况下,编译器允许通过指针修改const值。但这是不明确的行为。

票数 0
EN

Stack Overflow用户

发布于 2012-10-27 09:27:12

我不想详细介绍你的例子,但我想做一些一般性的评论:

C语言语义只在一定程度上由编译器和硬件强制执行:程序员有责任避免未定义的行为。

例如,很有可能修改自动存储持续时间(堆栈分配)的const限定变量,方法是将常数从指针中丢弃,而不获取分段错误(硬件强制执行)或编译器错误(强制转换告诉它闭嘴,因为您知道自己在做什么)。

然而,语言约束将被违反,代码将在实践中中断,因为优化器将做出不再成立的假设。

然后,有一种误解,即用于访问对象的表达式的类型与操作的确定性相关--它不是。

有效的类型规则(C99 6.5§6)本质上使C成为一种类型系统非常不健全的强类型语言。类型信息(其中包括可变信息)是由对象(存储位置)本身携带的,而不管如何访问该位置。

这使得存储到const限定的存储位置是非法的(未定义的行为),但在技术上是可能的(不健全的类型系统)。任意类型的双关通过指针属于同一类别的操作,这些操作违反了语言语义,但没有强制执行,因此可能导致奇怪的错误(如在严格混叠的假设下)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13098536

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档