char s和char s 的區別

2021-10-03 16:07:34 字數 3256 閱讀 1531

char *str1 = "hello";

char str2 = "hello";

我們說這個是定義而不是宣告,是因為定義在記憶體裡面分配了房子。而宣告,只給了個房產證卻不給你分房子。

str1 是 char *型別 。它是乙個指標,這個指標指向乙個字串。

str2 是 char 型別。它是乙個陣列,他代表了這堆記憶體空間。

「hello」字串在記憶體中是這樣存放的

str1 str3都是指向字串的指標,而且這個字串是儲存在字串常量區的。這個常量區裡面的東西是不能被修改的。編譯器讓他們指向了同乙個位址。這個位址儲存的東西是 「hello」這個字串。

#include "stdio.h"

#include "stdlib.h"

#include "string.h"

int main(void)

存在問題:

memcpy嘗試向乙個非法的位址拷貝東西,這個是不允許的。

為什麼說這個位址非法呢?因為字元常量區裡面的內容,只可以讀,不可以寫

#include "stdio.h"

#include "stdlib.h"

#include "string.h"

int main(void)

指標的本質是指標變數。

指標變數儲存的內容是乙個位址。既然是變數,那麼儲存的位址是可以變化的。只要型別符合。都可以儲存。

同樣的,在上面的例子中,如果我們嘗試這樣

str1[1] = 'a';
這樣也是錯誤的。這樣也是寫操作了非法的位址。

試試下面這段**

#include int main()
輸出

str1: hello, address: 0000000000404000, sizeof(str1): 8

str1: world, address: 0000000000404031, sizeof(str1): 8

--------------------------------

process exited after 0.0226 seconds with return value 1

請按任意鍵繼續. . .

通過賦值運算後,str1的值也發生了改變。

但是str2情況會不一樣,str2是乙個陣列。

既然是陣列,我們看看這段小**

#includeint main()
輸出日誌

str2: hello, address: 000000000062fe10, sizeof(str2): 6

str2: healo, address: 000000000062fe10, sizeof(str2): 6

str2: world, address: 000000000062fe10, sizeof(str2): 6

--------------------------------

process exited after 0.04063 seconds with return value 1

請按任意鍵繼續. . .

送乙個圖

輸出如下:

s:0000000000404008 s1:0000000000404008

a:0000000000404000 a1:0000000000404004 b:000000000062fe14 b1:000000000062fe10

--------------------------------

process exited after 0.03901 seconds with return value 1

請按任意鍵繼續. . .

可以看到,s,s1,a,a1在乙個記憶體區域。這個記憶體區域的內容是不允許改變的。

如果你對這裡的記憶體區域賦值,就會出現段錯誤。

#include #include "stdlib.h"

#include "string.h"

const int b = 2;

int main()

輸出:

b1:2

b1:3

--------------------------------

process exited after 0.0403 seconds with return value 1

請按任意鍵繼續. . .

再看乙個

#include #include "stdlib.h"

#include "string.h"

const int b = 2;

int main()

輸出:

b:2

--------------------------------

process exited after 3.743 seconds with return value 3221225477

請按任意鍵繼續. . .

如果放到gcc下,可以看到,執行到**

*p = 3;
會出現段錯誤。因為訪問了不能訪問的位址。

這也就是我們很多時候給空指標賦值出現段錯誤的原因。操作了非法的位址。

char s 和 char s 的區別

char d hello 中的a是指向第乙個字元 a 的乙個指標 char s 20 hello 中陣列名a也是執行陣列第乙個字元 h 的指標。現執行下列操作 strcat d,s 把字串加到指標所指的字串上去,出現段錯誤,本質原因 d 0123456789 存放在常量區,是無法修的。而陣列是存放在...

char s 和 char s 的區別

最近的專案中有不少c的程式,在與專案新成員的交流中發現,普遍對於char s1 和 char char s1 hello char s2 hello 區別所在 char s1 的s1,而指標是指向一塊記憶體區域,它指向的記憶體區域的大小可以隨時改變,而且當指標指向常量字串時,它的內容是不可以被修改的...

char s 和 char s 的區別小結

char s1 hello char s2 hello 區別所在 char s1 的s1,而指標是指向一塊記憶體區域,它指向的記憶體區域的大小可以隨時改變,而且當指標指向常量字串時,它的內容是不可以被修改的,否則在執行時會報錯。char s2的s2 是陣列對應著一塊記憶體區域,其位址和容量在生命期裡...