首先看兩個例子
一、
二、
這兩個例子裡面不同的地方就是s的不同,c語言程式在執行的時候記憶體分配有這樣的規則
區域性變數在棧中自動生成記憶體,比如上面所說的s就是在棧中生成記憶體
而s*指向的內存在常量區,就類似於我們在所有程式之前宣告char s[100]一樣
棧由編譯器自動生成釋放,而常量區的記憶體是由作業系統決定的
回到咱們之前說的那個,兩份**返回的s都指向第乙個字母的記憶體位址,第乙個由於在常量區,所以一直存在,第二個在函式tostr函式執行之後記憶體就釋放了,所以會報錯
而像其他的寫法
char *s;
s = 「abcdefg」;
其實和第一種方法相同
char *s;
s[0] = 『a』;
和第二種相同
char *只是乙個指標,在第一句的時候還未指向記憶體
其他情況
這裡的segmentation fault是發生在strcat裡面的,這裡面不能對指標直接操作,因為指標沒有指向記憶體,後面的記憶體沒法儲存
這種情況是因為常量區的記憶體是無法進行修改,通過指標只能訪問字串常量,不能改變這個常量
所以以後有這種情況就思考這幾點
1、直接對指標操作,指標都沒指向記憶體肯定不能操作啊
2、試圖訪問乙個不存在的記憶體位址,位址在棧中還是在**啊
3、是否有訪問許可權,我們不能修改當前執行的.c檔案或者二進位制檔案,還有剛剛說的指標只能訪問常量區的記憶體但是不能修改那樣
語言雜記 0x0A
今天寫乙個字串反轉練練手,涉及到手動輸入字串時出現了一些問題 char s scanf s s 採用字元陣列的方式輸入的時候完全沒有問題,但是採用下面的方式的時候就會報錯 核心以轉儲 char s scanf s s 什麼是核心已轉儲呢?通俗的理解就是訪問了不能訪問的內容,如下 所以我們的char ...
C語言雜記 0x01
ascii碼中 字元a是97,字元b是98,計算 a 1這個表示式,應該按照ascii碼把 a 當做證書值97,然後加1,得到98,然後printf把98這個整數值當做ascii碼來列印,列印出相應字元b 我們稱整型為 int 型,現在我們知道 char 型別本質上也是整數,只不過比 int 型別的...
C語言雜記 0x04
函式的返回值可以理解為 定義乙個和返回值型別相同的變數,並且用return後面的語句進行初始化 函式分返回值不是左值,或者說函式表示式不能作為左值,因此下面的表示式是違法的 is even 20 1 遞迴能解決的問題迴圈也能解決,只是解決的思路不一樣 對於遞迴來說,分配和釋放了好多位址空間,所有變數...