易犯的錯誤 C指標指向記憶體空間的常量區

2021-07-25 10:08:26 字數 441 閱讀 1198

根據下面語句寫出結果:

char* s = 「aaa」;

printf(「%s」, s);

s[0] = 'b';

printf(「%s」, s);

看到上面的短程式,或許我們會覺得顯而易見,這裡指標s指向了aaa,存放的是aaa的位址,所以第乙個列印的結果為aaa,s[0]代表的是指向字串aaa的首位址,所以會覺得第二個列印的結果就是baa,即將第乙個字元更改為了b。

然而在將上面的程式進行驗證時,編譯執行後發現只有第乙個列印正確,接著是出現「段錯誤」!

這是因為指標雖然指向了aaa,但是aaa為字串,存放在記憶體空間中的常量區(資料段的rodata段)。解釋到這裡我們就可以很容易的明白段錯誤的原因。對於常量的值是不可修改的,這也是非常容易因為不去考慮其儲存空間而犯的錯誤。在此引以為戒,避免再次犯這樣的錯誤!

C語言指標學習中易犯的錯誤

1 向null位址處copy資料 char str null strcpy str,aaaaabbbbb 錯誤!null是作業系統保護的空間,不能往裡面拷貝資料 2 void swap int a,int b 錯誤案例 不能實現實參a,b的互換 void swap int a,int b 在函式呼叫...

c 中易犯的錯誤

變數定義 用於為變數分配儲存空間,還可為變數指定初始值。程式中,變數有且僅有乙個定義。變數宣告 用於向程式表明變數的型別和名字。定義也是宣告 當定義變數時我們宣告了它的型別和名字。extern關鍵字 通過使用extern關鍵字宣告變數名而不定義它。1.定義也是宣告,extern宣告不是定義,即不分配...

c 繼承機制易犯的錯誤

繼承作為物件導向的基本特徵之一,其使用率極高。不管是為了實現軟體的基本功能,還是再程式的重構的過程中,我們總是會用到繼承機制。正是因為其用途極為廣泛,而且使用簡單,大眾程式設計師對其真正的內部實現機制的 不是很深。而且,在大部分情況下,我們對繼承的使用方法是錯誤的。下面用例子來說明問題。class ...