“检测到堆栈粉碎”的原因是什么?

2024-01-02

我是编程新手,目前正在研究地址类型转换。我似乎不明白为什么我会得到这个:*** 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(使用前将#替换为@)

“检测到堆栈粉碎”的原因是什么? 的相关文章

随机推荐