繁体   English   中英

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

[英]How can understand a constant variable in memory. C++

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

    //--------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;

在第一种情况下,&cst_a和ptra具有相同的内存地址,但它们的值可以单独更改。 在第二种情况下,cst_ptr_b和&b也是相同的地址,但它们的值会对称地改变。 为什么?

它可以存储在无法修改的存储区中。 因此,您的const_cast导致未定义的行为。

恭喜, *ptra = 6; 是未定义的行为。 :)
不允许写入常量值,而不是通过指针,而不是通过引用。 这是因为常量对象可能(并且很可能会)被放入常量内存区域。

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

const int c = 5; // This will be stored in read only area

尝试修改只读区域是Undefined Behavior(您使用const_cast在代码中完成)

其他情况是,

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

问题是在示例#1中发生的显式类型转换。 C ++让你这样做,因为const int *和int *是不同的类型以及编译器自由选择将常量存储在可写或不可写的内存中会产生这种未定义的行为,如前面的帖子所述。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM