C語言指針 字符串 內存

char p[] = "hello world";    -稱爲A定義方式

char * p = "hello world";    -稱爲B定義方式
兩個p的區別
 

分兩種情況:


這個p是全局變量(通俗點就是在函數外面定義的)
那麼這兩種方式, 產生的效果有點相同的地方:

 A:使用A定義方式, 只分配了  sizeof(p) ==  sizeof("hello world") == 12 字節的內存
 (字符串長度爲11, 加上一個字節的結束符號)
 p是這段內存的開始地址, 他不是實際的指針變量,所以   p = p+1;  這類的操作,連編譯都通過不了。

 B:使用B定義方式,字符串分配了 sizeof("hello world") == 12
 的內存,除了這之外還分配了sizeof(p) == sizeof(void *) 的內存(一個指針的內存一般是4或8字節)
 p是一個指針, 它存的值是這個字符串的開始地址。 所以    p++; p = "shit";   這類的操作都是合法的。

但是如果B方式沒有修改p指針的指向,這兩種方式使用p都能夠獲取到字符串"hello world", 產生是一樣的錯覺,其實差別很大。
但是有一點是相同的:  相同的字符串 "hello world" 會存放在全局變量存放的地方。


2
這個p是局部變量(通俗點就是在函數內部定義的)
那麼這兩種方式, 產生的效果就會有很大的不同:

 A:使用A定義方式, 只在stack(棧)中分配了12字節的內存
 p是這段內存的開始地址, 他不是實際的指針變量,所以   p = p+1;  這類的操作,連編譯都通過不了。
 而且只能在函數內部使用p,函數返回後,p這塊內存值就是非法的了

 B:使用B定義方式,也是在全局變量區分配了 sizeof("hello world") == 12的內存,
 除了這之外還在stack(棧)中分配了一個指針的內存
 p是一個指針, 它存的值是這個字符串的開始地址。 所以    p++; p = "shit";   這類的操作都是合法的。
 但是只能在函數內部使用p

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章