問題實際上來自當我使用(&ch_array + 128)
與&ch_array[128]
,當bcopy(&ch_array + 128, buf, 128);
ch_array
是一個數組(50 char
陣列,要準確)。 &ch_array[0]
是指向char
的指針,指向ch_array
的初始元素。
在大多數情況下,該陣列名稱轉換爲指針到它的初始元素,但例外(1)之一是當它是地址操作者&
的操作數。
因此&ch_array
是指向50 char
陣列,並且
&ch_array + 128
是增加128 * sizeof(char[50])
到的ch_array
地址。通過我們在問題中給出的內容,該附加調用了未定義的行爲,但實際上,通常您將從ch_array
開始獲得地址128*50 = 6400
字節。
在另一方面&ch_array[128]
,是一個指針到陣列ch_array
的128個元素(即不存在,所以它更未定義的行爲),從ch_array
開始128個字節。
如果你定義它
char *ch_array = (char *) malloc(sizeof(char)*50);
然後ch_array
是一個指向char
,它也具有相同的值作爲&ch_array[0]
,但與上述情況,也沒有涉及到轉換。
然後,&ch_array
是char**
,和&ch_array + 128
將是 - 無需因爲ch_array
時調用的未定義的行爲是不足夠大的char*
數組的元素 - 一個char**
指向的地方後面128 * sizeof(char*)
字節,其中ch_array
被存儲。
(1)例外情況是,當型「陣列T的」的表達是sizeof
或地址(&
)運算符的操作數,並且當其是用於初始化一個char
一個字符串文字數組或用於初始化寬字符數組的寬字符串文字。
你的主題和問題是不同的。 '&ch_array + 128'是無意義的。 – leppie 2013-04-28 17:54:50
不要一個問三個問題。 – 2013-04-28 18:37:49