如果我有一个常量变量,它是否存储在非常量变量的单独存储空间中?我在这个节目中遇到了一些奇怪的事情。
//--------assign a const value to non-const value-------
const int cst_a = 5;
int* ptra = const_cast<int*>(&cst_a);
cout<<&cst_a<<" "<<ptra<<endl; // same address
*ptra = 6;
cout<<*ptra<<" "<<cst_a<<endl; // same address with different value
//--------assign a non-const value to const value-------
int b = 50;
const int* cst_ptr_b = &b;
cout<<cst_ptr_b<<" "<<&b<<endl; // also same address
b = 55;
cout<<b<<" "<<*cst_ptr_b<<endl; // same address with same value
return 0;
在第一种情况下,&amp; cst_a和ptra具有相同的内存地址,但它们的值可以单独更改。在第二种情况下,cst_ptr_b和&amp; b也是相同的地址,但它们的值是对称的。为什么呢?
答案 0 :(得分:4)
它可能存储在无法修改的存储区中。因此,您的const_cast
会导致未定义的行为。
答案 1 :(得分:0)
恭喜,*ptra = 6;
是未定义的行为。 :)
不允许写入常量值,而不是通过指针,而不是通过引用。这是因为常量对象可能(并且很可能会)被放入常量内存区域。
答案 2 :(得分:0)
这取决于您在常量中存储的值。
const int c = 5; // This will be stored in read only area
尝试修改只读区域是未定义的行为(您使用const_cast
在代码中完成的行为)
其他情况是,
int i = 5;
const int c = i; // This is stored in normal read/write memory segment
答案 3 :(得分:0)
问题是在示例#1中发生的显式类型转换。 C ++让你这样做,因为const int *和int *是不同的类型,而编译器可以自由选择在可写或不可写内存中存储常量,这会产生这种未定义的行为,如前面的帖子所述。