c++从const int*到int*的转换,处理意外结果
C++ Conversion from const int* to int* working with unexpected results
在c++中,我们知道不能将const int*转换为int*。但是我有一个代码片段,我可以把const int*转换成int*。我是c++的初学者,我在谷歌上搜索了这个,但我只是得到了提到const int*不能转换为int*以避免const违反的链接。我不明白为什么它编译没有错误
#include <iostream>
using namespace std;
int main(void)
{
const int a1 = 40;
const int* b1 = &a1;
int* c1 = (int *)(b1);
*c1 = 43;
cout<< c1<<" "<< &a1<<endl;
cout<< *c1<<" "<< a1<<endl;
}
同样,问题是上面程序的输出是:
0x7fff5476db8c 0x7fff5476db8c
43 40
有人可以解释c1整数指针是指向相同的地址a1,但有不同的值43和40分别
在c++中,对象是const还是非const。如果它是const,那么任何修改它的尝试都将调用未定义行为。你就是这么做的。在那个点任何都可能发生。如果你幸运的话,它会崩溃。如果不那么幸运,它也可以正常工作,直到您的代码交到客户手中,并可能造成最大的损害。
在c++中,可以很容易地将const int*类型转换为int*类型。你刚才说了。然而,"const int*"answers"int*"并不意味着指向的对象是否是const。它只是意味着编译器不允许你在一种情况下赋值,而允许你在另一种情况下赋值。*c1
是const
。将指针指向int*
不会改变它是const
的事实。未定义的行为。 这是未定义的行为。
但是,在这种情况下发生的事情是编译器已经意识到它可以用实际值40替换cout
语句中的a1
,因为它意味着const
。
千万不要依赖这个。它很容易纹在你的猫身上。
const int
变量将占用堆栈内存,但编译器将简单地将a1
的所有实例替换为40
。表达式&a1
不会被替换,以及如何神奇地指向堆栈上的内存。当您更改内容时,内存中的内容将被更改,但这些常量40
不会更改。因此它们的输出不同。
这只是未定义的行为,可能因编译器而异。一个编译器可能会显示43
,另一个编译器可能总是显示40
,还有一些编译器可能会生成代码导致崩溃(写入只读内存)。别这么做!
运行这个,也许会有帮助。
const int a1 = 40;
std::cout<<"__________ const int a1 = 40; ____________________________________"<<std::endl;
std::cout<<"a1: "<< a1<<std::endl;
std::cout <<"&a1 "<< &a1<<std::endl;
std::cout <<"*a1: INVALID"<<std::endl;
const int* b1 = &a1;
std::cout<<"__________ const int* b1 = &a1; ____________________________________"<<std::endl;
std::cout<<"b1: "<< b1<<std::endl;
std::cout <<"&b1 "<< &b1<<std::endl;
std::cout <<"*b1 "<< *b1<<std::endl;
int* c1 = (int *)(b1);
std::cout<<"__________ int* c1 = (int *)(b1); ____________________________________"<<std::endl;
std::cout<<"c1: "<< c1<<std::endl;
std::cout <<"&c1 "<< &c1<<std::endl;
std::cout <<"*c1 "<< *c1<<std::endl;
*c1 = 43;
std::cout<<"__________ *c1 = 43; ____________________________________"<<std::endl;
std::cout<<"c1: "<< c1<<std::endl;
std::cout <<"&c1 "<< &c1<<std::endl;
std::cout <<"*c1 "<< *c1<<std::endl;
std::cout<<"c1: "<< c1<<std::endl;
std::cout<<"*c1: "<< *c1<<" -----> *&a1: "<< *&a1<<" - a1: "<< a1<<std::endl;
std::cout<<"&c1: "<< &c1<<std::endl;
相关文章:
- 对 pair<pair<int,int>pair<int,int unordered_map进行哈希处理>>
- 使输出流式处理运算符适用于 boost::variant<std::vector<int>、int、double 的正确方法是什么>
- 在comparison中处理int和std::vector::size_type
- unordered_map<int,int>如何处理负面元素?
- 如何处理使用不同类型索引的不同库(例如 stl 和 eigen3)的混合(size_t、int、..)
- 处理代码重新定义int类型(uint16_t,int16_t等),并不喜欢它
- 返回处理数组的INT功能
- 如何处理计算中的"unsigned long long int"?
- 如何处理警告:从较小的整数类型int转换为int*
- 当我使用可变参数时,它可以很好地处理int和double,但当涉及到float时,会发生错误
- 处理需要在c++中一起存储的3个int类型的正确方法
- 为什么VC C4244警告(可能丢失数据)专门处理'int'?
- C++1z 处理 == 测试,在自动函数中使用 std::initializer_list<int> 和 w/o const
- 如何从长 N 位中剪切以获得 int 并对其进行处理(并获得可读的 int)
- 在c++2中处理int数组
- 如何创建一个通用指针,它可以处理int和double变量并避免范围问题
- C++如何处理 const double&引用 int?
- C++中的异常处理:使用 "throw(int)" 时抛出双精度
- 将处理后的浮点值类型转换为 int 会降低实际值
- GCC编译器是否可以处理比long / long / int更大的其他数据类型?