2016-12-14 91 views
-2
#include <stdio.h> 

void f(char**); 

int main() { 
    char *argv[] = { "ab", "cd", "ef", "gh", "ij", "kl" }; 

    f(argv); 
    return 0; 
} 



void f(char **p) { 
    char *t; 

    t = (p += sizeof(int))[-1]; 
    printf("%s\n", t); 
} 

這是我有的代碼,問題是要求輸出。我想知道爲什麼輸出是gh。我認爲sizeof(int)將等於char中的元素數量,以「t」語句爲單位,它會使得它爲6,然後減1。然後我打印sizeof(int),它給了我4.我只是困惑爲什麼sizeof(int)是4而不是6. 在此先感謝。爲什麼這個代碼的輸出是gh?

+3

'sizeof(int)將等於char中元素的個數'你怎麼可能得出這個結論? – John3136

+0

嘿,猜猜是什麼'argc'! – paddy

+0

我的意思是說,如果它只是一個字符串說「字符串」它將是該字符串的字節大小?然後我進一步尋找和糾正我,如果我錯了,但它會是4,因爲它計算指向字符的大小,這將是4字節? – thrugs

回答

1

t = (p += sizeof(int))[-1];說明:

  1. p這是一個指針由sizeof(int)元素遞增。在您的機器上,sizeof(int)似乎是4
  2. p是指向第五個元素的指針,它是"ij"
  3. [-1]指定p減一個元素爲tp減1表示您指向指向"gh"的指針。噢,由於方括號的存在,這裏有一個取消引用操作。
  4. print t

只是爲了說明第三點,你可以通過下面的代碼替換f和檢查:

void f(char **p) { 
    char **t; 

    t = (p += sizeof(int)) - 1; 
    printf("%s\n", *t); 
} 

HTH。

+1

我不確定我喜歡「'[-1]'將'p'減少一個元素賦值爲't'我認爲你得到的是根據標準,」E1 [E2] (*((E1)+(E2)))。「(ISO/IEC 9899:2011 6.5.2.1/2)因此,'p [-1] ==(*(p - 1) )',這很好,只要'p'不指向數組的第一個元素,所以't'實際上被分配了'p'前面的指針所引用的值。 –

+0

@DavidBowling「't '實際上被分配了'p'前面的指針所引用的值 - 精彩地放入。:) – babon

0

我只是困惑,爲什麼的sizeof(int)的是4,而不是6

其他人已經給你正確的答案,所以我只是想幫你彌合差距你對sizeof(int)的假設。

sizeof是一個C操作符(不是函數)。如果您有Linux或Mac可用,終端中的人操作員將向您顯示整個列表。它產生操作數的大小,以字節爲單位。與大多數操作員不同,sizeof操作變量。當您說sizeof(int)時,您將sizeof應用於數據類型int。不出所料,結果總是相同的,因爲在C中,每個程序中的每個int具有相同的大小。在你的機器上,這個尺寸是4.

進一步,你可以看到給一個變量的名字sizeof只是一個方便。編譯器解析名稱,找到其類型,並獲取該類型的大小。

的char * argv的[]

我們可以應用的sizeof您argv有效找出多少元素在數組中。整個陣列的大小(以字節爲單位)爲sizeof(argv)。每個元素(因爲數組中的所有元素都具有相同的大小)的大小(以字節爲單位)爲sizeof(argv[0])。那麼元素的數量是sizeof(argv)/sizeof(argv[0])。你甚至可以說,

enum { nargv = sizeof(argv)/sizeof(argv[0]) }; 

因爲所有的信息在編譯時可用。

相關問題