我是编程新手,目前正在研究地址类型转换。我似乎不明白为什么我会得到这个:*** stack smashing detected ***: terminated Aborted (core dumped)
当我运行以下代码时?
#include<iostream>
using namespace std;
void updateValue(int *p){
*p = 610 % 255;
}
int main(){
char ch = 'A';
updateValue((int*)&ch);
cout << ch;
}
以下是我对代码的理解:
地址为ch
被类型转换为int*
并传递到函数中updateValue()
。现在,在updateValue()
堆栈,整数指针p
创建它指向ch
。当 p 被取消引用时,它解释为ch
as an int
并读取 4(或 8)字节的连续内存而不是 1。所以,'A'
(65) 以及一些垃圾值被分配给610%255
即20。
但我不明白,到底哪里出了问题?
当 p 被取消引用时,它会解释...
当你间接地通过重新解释p
并访问错误类型的对象,程序的行为是未定义的。
出了什么问题以及哪里出了问题?
当您将指向一种类型的指针重新解释为指向不相关类型的指针时,事情就开始出错了。
一些经验法则:
- 在您知道重新解释的作用之前,不要使用它。它们很难正确使用,而且很少有用。
- 当重新解释强制转换会导致未定义的行为时,请勿使用它。
- 根本不要使用 C 风格的强制转换。
- 如果您认为需要重新解释演员阵容,请退后几步并考虑why你认为你需要它。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)