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

Pra*_*har 1 c++ pointers casting undefined-behavior

我是编程新手,目前正在研究地址类型转换。我似乎不明白为什么我会得到这个:*** 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; 
}
Run Code Online (Sandbox Code Playgroud)

以下是我对代码的理解:

的地址ch被类型转换int*并传递给函数updateValue()。现在,在updateValue()堆栈内部,p创建了一个指向 的整数指针ch。当 p 被取消引用时,它会解释ch为 anint并读取 4(或 8)字节的连续内存而不是 1。因此,'A'(65) 以及一些垃圾值被分配给610%255即 20。

但我不明白,到底哪里出了问题?

eer*_*ika 7

当 p 被取消引用时,它会解释...

当您通过重新解释间接p访问错误类型的对象时,程序的行为是未定义的。

出了什么问题以及哪里出了问题?

当您将指向一种类型的指针重新解释为指向不相关类型的指针时,事情就开始出错了。

一些经验法则:

  • 在您知道重新解释的作用之前,不要使用它。它们很难正确使用,而且很少有用。
  • 当重新解释强制转换会导致未定义的行为时,请勿使用它。
  • 根本不要使用 C 风格的强制转换。
  • 如果您认为需要重新解释演员阵容,请退后几步,并考虑为什么您认为需要它。