ERROR C 字元指標引起的段錯誤

2021-06-28 22:38:54 字數 989 閱讀 3997

問題:

程式編譯通過,執行異常終止。

進入除錯模式,報段錯誤。

分析:

逐行除錯,在為char指標所指內容修改時出錯。

原因:

char *c = "abc"

此時,無法根據指標來修改字串內容。

//example 1:

char str[12] = "hello"; //字串用陣列開闢的,它是可以改變的變數。

char *p = str;

*p = 'h';  //改變第乙個字母

//example 2:

char *ptr = "hello";  //字串則是乙個常量,也就是字面值。ptr只是指向它的指標而已,而不能改變指向的內容。

*ptr = 'h';  //錯誤

example 1:實際上先是在文字常量區分配了一塊內存放"abc",然後在棧上分配一位址給c1並指向這塊位址,然後改變常量"abc"自然會崩潰。

example 2:然而char c2 = "abc",實際上abc分配記憶體的地方和上者並不一樣

深入原因:

前提 程式記憶體分布概述

(引自:

1、棧區(stack)—由編譯器自動分配釋放,存放函式的引數值,區域性變數的值等。其操作方式類似於

資料結構中的棧。

2、堆區(heap)—一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由os**。注意它與資料結構中的堆是兩回事,分配方式倒是類似於鍊錶。

3、全域性區(靜態區)(static)—全域性變數和靜態變數的儲存是放在一塊的,初始化的全域性變數和靜態變數在一塊區域,未初始化的全域性變數和未初始化的靜態變數在相鄰的另一塊區域。程式結束後由系統釋放。

4、文字常量區—常量字串就是放在這裡的。程式結束後由系統釋放。

5、程式**區

舉例說明:

int a=0;    //全域性初始化區

char *p1;   //全域性未初始化區

main()

牛客網 快慢指標引起的段錯誤

快指標找到中間節點 能正常執行的寫法 listnode slow head listnode fast head while fast nullptr fast next nullptr 在除錯的過程中發現,快慢指標尋找中間節點過程中,如果條件變成 不能正常執行的寫法 listnode slow h...

由pthread create引起的段錯誤

一般執行緒的結束是由程序內的其他執行緒來結束的,呼叫pthread cancel.但是需要考慮到被結束執行緒的性質,一方面,執行緒是可被結束,也可無法結束,即不響應該訊號 另一方面,如果執行緒是可被結束的,那麼結束的方式有兩種,一種是同步,當執行緒收到這個訊號的時候先掛起,等到下乙個取消點時再響應該...

指標引起的崩潰分析

指標引起的崩潰問題,常見的原因如下 勞資還沒乾貨呢,你就讓勞資幹活了。這種情況實際專案當中是非常多的,即使你用了智慧型指標,也還是無法避免。當工程很龐大複雜而且乙個類都有可能多個人負責的時候,那麼這個指標的訪問堆疊確實千變萬化,你無法確定是 調到這裡來的,也就無法確保該指標一定指向了某一物件,當然判...