2011年4月9日17:42:57
C中的字符串數組與字符串指針的區別
從上面的截圖,我們可以看到字符數組和字符串的差別。他們的類型是不同的,比如上面的代碼中,filename的類型是char[12],而pname的類型是char*,&filename的結果是數組指針,圖中顯示的是char[12]*。還可以發現,對於pname和p雖然是兩個不同的指針,但是他們都指向同一個地址,這也是編譯器投機取巧的地方,因為他們都是指向"fangzhen"這個字符串,所以編譯器就只存儲一次。
還有&"fangzhen"的用法也是可以的。
2011年4月10日11:24:40
c中多維數組的內存分配過程
第一種方法:
arr值為0x002efaae8, 指向int**所在的位置,即*arr所在的位置
*arr值為0x003C4F78, 這是指向的rows個int*所在的內存位置
可以看到綠框后面還有8個初始化化為0的字節, 其實后面是(*arr)[1]和(*arr[2])的地址, 共rows(3)個int*的地址,即共3個int**
第一個int*所在的位置為0x003c1290, 沒有進行初始化
第二個int*所在位置為0x003c12e0(從下圖我們可以讀出)
具體分配的內存為:
-
在內存1中查看
-
在內存2中查看
第3個int*所在位置為0x003c1580(從下圖的藍色框內可以看出)
具體的內存分配為:
-
在內存1中查看
-
在內存2中查看
二維指針(int**) 占4個字節, 3個一維指針(int*)各占4個字節
每個一維數組占16個字節, 相當於rows*cols+rows+1個整型(4個字節)
-
第2中方法:
(1)還沒有執行第一個if
brr是*brr的地址, 即這個二維指針int**首地址
現在還沒有執行對*brr分配內存,所以brr處的內存是隨機的,
(2)第一個if執行完畢, 分配了3個(int*)大小的空間, 所在的內存位置為0x00244fc0
*brr的值為0x00244fc0, 其實這也是第一個int*的地址
還沒有執行第二個if 之前,沒有對(*brr)[0]進行空間的分配, 內存中的數都是隨機數
第二個if執行之后, 為(*brr)[0]完成了空間分配, (*brr)[0]的分配所得到的內存在0x00241380處, 此時共有rows*cols*4=48個字節數
我們到0x00241380處查看, 可以發現, 所分配的48個int型內存進行了初始化
到此為止, 其實內存都已經分配完畢, 現在所要做的就是為(*brr)[1]和(*brr)[2]進行賦值.
for循環執行一次之后, 我們得到(*brr)[1]的地址, 即0x00241390, 相當於在這個內存處開始是8個int整型數(第2個一維數組)
for循環執行兩次后, 我們得到(*brr)[2]的地址, 即0x002413a0, 相當於在這個內存處開始是8個int整型數(第3個一維數組)
可以發現這些地址之間是相差16個字節的,他們的內存是連續的.
通過比較上面的兩個函數, 我們也可以看到, 其實不同在於, 第一個的空間是分散的, 第二個的空間是連續的.