C++ 如何理解内存中的常量变量。C++;

C++ 如何理解内存中的常量变量。C++;,c++,pointers,constants,C++,Pointers,Constants,如果我有一个常量变量,它是否存储在与非常量变量分开的内存空间中?我在这个节目中遇到了一些奇怪的事情 //--------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 ad

如果我有一个常量变量,它是否存储在与非常量变量分开的内存空间中?我在这个节目中遇到了一些奇怪的事情

    //--------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;
/-----------将常量值分配给非常量值-------
常数int cst_a=5;
int*ptra=const_cast(&cst_a);

cout它可能存储在一个无法修改的存储区域中。因此,您的
常量转换将导致未定义的行为。

它可能存储在无法修改的内存区域中。正因为如此,您的
常量转换将导致未定义的行为。

恭喜,
*ptra=6是未定义的行为。:)

不允许通过指针或引用写入常量值。这是因为一个常量对象可能(而且很可能会)被放入常量内存区域。

恭喜,
*ptra=6是未定义的行为。:)

不允许通过指针或引用写入常量值。这是因为常量对象可能(而且很可能会)被放入常量内存区域。

这取决于您在常量中存储的值

const int c = 5; // This will be stored in read only area
试图修改只读区域是未定义的行为(您已在代码中使用
const\u cast

另一种情况是

int i = 5;
const int c = i;  // This is stored in normal read/write memory segment

这取决于常数中存储的值

const int c = 5; // This will be stored in read only area
试图修改只读区域是未定义的行为(您已在代码中使用
const\u cast

另一种情况是

int i = 5;
const int c = i;  // This is stored in normal read/write memory segment

问题在于示例1中发生的显式类型转换。C++让我们这样做,因为const int *和int *是不同类型的,编译器可以自由地选择在可写或不可写内存中存储常量,这就产生了未定义的行为,如前面的文章所说的。< /P> < P>问题是在示例1中发生的显式类型转换。C++让我们这样做,因为const int *和int *是不同类型的,编译器可以自由地选择在可写或不可写内存中存储常量,这使得前面定义的行为不明确,

如<代码> int i=5的情况如何;常数int c=i;我想在这种情况下,
c
将不会存储在只读区域中。@iammilind:我说过它可能存储在无法修改的内存中。你提到的一个案例可能会阻止这种情况。我不相信有任何保证,常数将永远存储在不可修改的内存中。无论如何,根据标准,这是未定义的行为。@iammilind:现代编译器(例如GCC 4.5)将检测到
c
始终使用值5初始化(在优化版本中)。但它也积极地优化了变量。也就是说,如果可以避免的话,它可能根本不会在内存中存储5。@MSalters,这只是一个粗略的例子。如何
fun(inti){constintc=i;}
;关键是
c
总是依赖于
i
,因此从这个意义上讲,
c
存储在只读区域是值得怀疑的。@iammilind:在这种情况下,编译器可以很容易地检测到
c
在其范围内根本没有被使用。这些例子的问题是它们通常非常简单,优化器总是可以对它们进行优化;常数int c=i;我想在这种情况下,
c
将不会存储在只读区域中。@iammilind:我说过它可能存储在无法修改的内存中。你提到的一个案例可能会阻止这种情况。我不相信有任何保证,常数将永远存储在不可修改的内存中。无论如何,根据标准,这是未定义的行为。@iammilind:现代编译器(例如GCC 4.5)将检测到
c
始终使用值5初始化(在优化版本中)。但它也积极地优化了变量。也就是说,如果可以避免的话,它可能根本不会在内存中存储5。@MSalters,这只是一个粗略的例子。如何
fun(inti){constintc=i;}
;关键是
c
总是依赖于
i
,因此从这个意义上讲,
c
存储在只读区域是值得怀疑的。@iammilind:在这种情况下,编译器可以很容易地检测到
c
在其范围内根本没有被使用。此类示例的问题在于,它们通常非常简单,优化器总能对其进行优化。如何理解“可能(和最有可能的意愿)”?如何理解“可能(和最有可能的意愿)”?最好将“其他场景”写成
const int c=rnd()%6
@Kiril,第二种情况表明,
const c
是可修改的。因为它依赖于并分配了一个变量值
i
i
可以是
6
10
任何值)。“其他场景”最好写成
const int c=rnd()%6
@Kiril,第二种情况表明,
const c
是可修改的。因为它依赖于并分配了一个变量值
i
i
可以是
6
10
任何值)。