簡體   English   中英

“檢測到堆棧粉碎”的原因是什么?

[英]What is the reason for "stack smashing detected"?

我是編程新手,目前正在研究地址類型轉換。 我似乎不明白為什么我會得到這個: *** 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*並傳遞到 function updateValue() 現在,在updateValue()堆棧中,創建了一個指向ch的 integer 指針p 當 p 被取消引用時,它將ch解釋為一個int並讀取連續 memory 的 4(或 8)字節而不是 1。因此, 'A' (65)以及一些垃圾值被分配給610%255 ,即 20。

但是我不明白,哪里出了問題?

當 p 被取消引用時,它解釋......

當您間接通過重新解釋的p並訪問錯誤類型的 object 時,程序的行為是未定義的。

哪里出了問題?

當您將指向一種類型的指針重新解釋為指向不相關類型的指針時,事情就開始出錯了。

一些經驗法則:

  • 在您知道它的作用之前,不要使用重新解釋轉換。 它們很難做對,而且很少有用。
  • 當它會導致未定義的行為時,不要使用重新解釋轉換。
  • 根本不要使用 C 風格的轉換。
  • 如果您認為需要重新解釋 cast,請退后幾步,考慮一下您認為需要它的原因

問題是您將char*類型轉換int*然后取消引用p ,這會導致未定義的行為

未定義的行為意味着任何事情1都可能發生,包括但不限於給出您預期的 output 的程序。但永遠不要依賴(或根據)具有未定義行為的程序的 output。 該程序可能會崩潰。

因此,您看到(可能看到)的 output 是未定義行為的結果。 正如我所說,不要依賴具有 UB 的程序的 output 該程序可能會在您的情況下發生崩潰。

比如這里程序崩潰了,但是這里沒有崩潰。

因此,使程序正確的第一步是刪除 UB。 只有這樣你才能開始對程序的 output 進行推理。


1有關未定義行為的更技術准確的定義,請參閱此處提到的內容: There are no restrictions on the behavior of the program

但是我不明白,哪里出了問題?

在這份聲明中

*p = 610 % 255;

不屬於 char 類型的 object ch 的 memory 被覆蓋。 那不是 object ch 占用的一個字節,而是覆蓋了 4 個字節,對應於分配給 object 的 memory 類型的 int。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM