正如标题中提到的,type-qualifiers是否会影响存储位置(stack、bss等),我并不感到困惑。关于declarator.To的更多描述,我正在考虑以下声明。
int main()
{
const int value=5;
const char *str= "Constant String";
}storage-class-specifier是auto。stack-frame of main中分配。pointers可以自由地修改其中包含的值。type-qualifier添加了一些逻辑来保留存储的元素的constant性质(如果是这样的话,它是什么?)或者constants存储在read-only-portion of memory.Please中,详细说明这一点。更详细的例子
#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);
}在上面的示例中,cptr和ptr都指向相同的位置。但是cptr是指向const type qualified整数的指针。在修改cptr的值时,编译器抛出一个错误为“指定只读位置‘*cptr’”。但是,我能够用修改与ptr相同的位置,就像在输出below.Please解释中一样
ptr: BFF912D8
cptr: BFF912D8
Value: 10发布于 2012-10-27 08:51:23
第一个示例中的:
int main()
{
const int value=5;
const char *str= "Constant String";
}将存储变量value和字符串文本的位置留给实现。C标准所保证的就是这些将存储在只读内存中,可以存储在文本段、堆栈或任何地方。
第二个例子中的:
int *ptr=&val;
const int *cptr=ptr;当您尝试修改*cptr时,编译器并不关心cptr指出的实际位置是只读的还是可写的。它只关心类型限定符const,它认为cptr指向的位置是只读的。
另一个变体:
const int i = 5;
p = &i;
*p = 99;在这种情况下,编译器允许通过指针修改const值。但这是不明确的行为。
发布于 2012-10-27 09:27:12
我不想详细介绍你的例子,但我想做一些一般性的评论:
C语言语义只在一定程度上由编译器和硬件强制执行:程序员有责任避免未定义的行为。
例如,很有可能修改自动存储持续时间(堆栈分配)的const限定变量,方法是将常数从指针中丢弃,而不获取分段错误(硬件强制执行)或编译器错误(强制转换告诉它闭嘴,因为您知道自己在做什么)。
然而,语言约束将被违反,代码将在实践中中断,因为优化器将做出不再成立的假设。
然后,有一种误解,即用于访问对象的表达式的类型与操作的确定性相关--它不是。
有效的类型规则(C99 6.5§6)本质上使C成为一种类型系统非常不健全的强类型语言。类型信息(其中包括可变信息)是由对象(存储位置)本身携带的,而不管如何访问该位置。
这使得存储到const限定的存储位置是非法的(未定义的行为),但在技术上是可能的(不健全的类型系统)。任意类型的双关通过指针属于同一类别的操作,这些操作违反了语言语义,但没有强制执行,因此可能导致奇怪的错误(如在严格混叠的假设下)。
https://stackoverflow.com/questions/13098536
复制相似问题