[英]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 時,程序的行為是未定義的。
哪里出了問題?
當您將指向一種類型的指針重新解釋為指向不相關類型的指針時,事情就開始出錯了。
一些經驗法則:
問題是您將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.