2013-04-28 64 views
1

當我定義:berween&ch_array [0]和ch_array有什麼不同?

char ch_array[50]; 
  1. 什麼&ch_array[0]ch_array之間的區別?

  2. 如果我這樣定義會怎樣?

    char *ch_array = (char *) malloc(sizeof(char)*50); 
    

    的問題實際上來自當我使用(&ch_array + 128)&ch_array[128]bcopy(&ch_array + 128, buf, 128);時。

  3. 我在這裏遇到了segementation故障,但是使用bcopy(&ch_array[128], buf, 128);沒有故障,爲什麼?它與存儲數組的位置有什麼關係?

+2

你的主題和問題是不同的。 '&ch_array + 128'是無意義的。 – leppie 2013-04-28 17:54:50

+1

不要一個問三個問題。 – 2013-04-28 18:37:49

回答

5

問題實際上來自當我使用(&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_arraychar**,和&ch_array + 128將是 - 無需因爲ch_array時調用的未定義的行爲是不足夠大的char*數組的元素 - 一個char**指向的地方後面128 * sizeof(char*)字節,其中ch_array被存儲。


(1)例外情況是,當型「陣列T的」的表達是sizeof或地址(&)運算符的操作數,並且當其是用於初始化一個char一個字符串文字數組或用於初始化寬字符數組的寬字符串文字。

+0

'_Alignof'異常實際上並不存在(這是C11標準的N1570草案中的錯誤,在最終標準中已修復)。 '_Alignof'運算符不會將表達式作爲操作數。 – 2013-04-28 18:23:33

+0

很高興知道。感謝您的提醒。 – 2013-04-28 18:41:13

+0

我的錯誤。在第三個問題中,我確實定義了ch_array [256] – jchnxu 2013-04-30 08:16:42

1
bcopy(&ch_array[128], buf, 128); 

相當於

bcopy(ch_array+128, buf, 128); 

bcopy(&ch_array+128, buf, 128); 

是完全不同的東西。

-1

首先,ch_array&ch_array是不同的,無論您使用何種定義的ch_arraych_array&ch_array[0]幾乎是同義詞,儘管偶爾地編譯器扼流器ch_array但接受&ch_array[0]ch_array&ch_array[0]都是char *類型。 &ch_array類型爲char **

ch_array + 128&ch_array[128]的同義詞。它不是&ch_array[128]的同義詞。前者意味着128字節到ch_array。後者意味着在地址ch_array之後有128個字符指針,這可能是某種隨機的;在你的情況下,它甚至不是你的地址空間的一部分。其次,如果你確實定義了ch_array[50]然後訪問第128個元素,那麼你也需要一個SEGV。

+1

-1'ch_array'不是'char *'類型,它的類型是'char [50]'。在大多數情況下,它被轉換爲'char *',但這不是一回事。 – 2013-04-28 18:40:11

相關問題