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 是陣列對應著一塊記憶體區域,其位址和容量在生命期裡...