char 與char 的區別

2021-06-20 04:15:59 字數 1198 閱讀 3866

乙個由c/c++編譯的程式占用的記憶體分為以下幾個部分

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

資料結構中的棧。

2、堆區(heap)—一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由os**。注意它與資料

結構中的堆是兩回事,分配方式倒是類似於鍊錶,呵呵。

3、全域性區(靜態區)(static)—全域性變數和靜態變數的儲存是放在一塊的,初始化的全域性變數和靜態

變數在一塊區域,未初始化的全域性變數和未初始化的靜態變數在相鄰的另一塊區域。程式結束後由系統

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

5、程式**區

char* get_str(void)    

;

return str;

}

char str = ;定義了乙個區域性字元陣列,儘管是陣列,但它是乙個區域性變數,返回它的位址肯定是乙個已經釋放了的空間的位址。

此函式返回的是內部乙個區域性字元陣列str的位址,且函式呼叫完畢後 此陣列被銷毀,所以你返回的指標也就指向一塊被銷毀的記憶體,這種寫法是錯誤的。

char* get_str(void)    

;

return str;

}

char* str = ;表示先定義個字串常量,並將其位址賦給str。

此函式返回的是字串常量的位址,而像這種字串都是屬於全域性的,在編譯的時候就已經分配了記憶體了,只有程式退出的時候才會被銷毀,所以返回它的位址是沒有問題的,但是你最好返回常量指標,因為你不能去改變字串常量的值。

char *str = "***xx",str指向該常量位址。  

char str = "***xx",str在棧上申請空間,將常量內容複製進來,所以是區域性變數。

char *a1 = "hello1";    

char *a2 = "hello1";

char a3 = "hello2";

char a4 = "hello2";

那麼在儲存上,"hello1"字串只會有乙份拷貝,a1和a2指向同乙個位置;  

"hello2"則有兩份拷貝,分別存在不同的位置,a3、a4位址也各不相同

char 與 char 的區別

hello world 作為靜態字串實際上儲存在資料區,但寫程式的人不知道這個位址,而程式本身知道。當某一函式以 方式使用此靜態字串時,實際上相當於 char p 12 strcpy p,hello world p 12 是在棧裡臨時分配的。雖然p指向的內容是 hello world 但是這是複製品...

關於char 與char 的區別

char a在執行時賦值,值會從靜態區賦值到函式的棧中,對它進行修改不會產生任何問題。char a在編譯時就確定了,a指向靜態區中的值,沒有賦值到函式棧中,因此對指標的內容進行修改會產生錯誤。和許多文章一樣,還是先來了解一下 乙個由 c c 編譯的程式占用的記憶體分為以下幾個部分 1 棧區 stac...

char 與char 型別的區別

參考文章 char s 和 char s 的區別小結 char s1 hello char s2 hello 區別所在 char s1 的s1是指標變數,而指標是指向一塊記憶體區域,它指向的記憶體區域的大小可以隨時改變,但當指標指向常量字串時,它的內容是不可以被修改的,否則在執行時會報錯。char ...