2015-12-21 36 views
-1
Case I: 
    int a[12]; 
    printf("%d",sizeof(a)); 

Case II: 
    int *a = (int *)malloc(12*sizeof(int)); 
    printf("%d",sizeof(a)); 

上面兩個代碼段返回不同的輸出在第一種情況下 有什麼INT之間*和int一個[大小]

  • 4在第二種情況下的差異,

    • 48

    這是爲什麼?

  • +1

    請問[數組名是C中的一個指針嗎?](https://stackoverflow.com/questions/1641957/is-array-name-a-pointer-in-c/1641963#1641963)使一個合適的重複?對'[c]數組指針'的搜索會產生33,000條左右的條目,這對搜索來說是一種痛苦。 –

    回答

    10

    因爲數組不是指針,反之亦然。期。

    詳細說明,如果是int a[12];a是一個數組,它擁有它自己的屬性。它的類型是陣列的,所以當你經過陣列名sizeof操作,它給你的陣列的大小(在你的情況下,12個int S,乘以的int,4大小,共48個) 。

    OTOH,int *a = malloc(12*sizeof*a);(更正格式),a是一個指針,並使用這個sizeof會給你只有指針本身的大小,分配(指出)內存的指針沒有大小。

    引述C-FAQ,第6章,

    問:但是我聽說char a[]是相同的char *a

    答:沒有。 (你聽到的與函數的形式參數有關)。數組不是指針,儘管它們是密切相關的。

    數組聲明char a[6]請求留出六個字符的空間,以名稱a爲名。也就是說,有一個名稱爲a的位置,可以放置六個字符。另一方面,指針聲明char *p請求一個包含指針的地方,名稱爲p。這個指針可以指向幾乎任何地方:任何char,或任何連續的chars數組,或無處。

    注:

    1. Please see this discussion on why not to cast the return value of malloc() and family in C.
    2. 爲了使代碼健壯且具有可移植性,在分配語句中更喜歡使用變量名本身而不是硬編碼數據類型。
    +4

    那段時間感覺非常強大:D Plus簡潔明瞭,但我相信這個問題可能是重複的。 – Transcendental

    +0

    @超感謝。只希望_period_的價值能夠被所有人理解。 :) –

    +0

    @SouravGhosh a [i]與*(a + i)禮相同嗎?那麼爲什麼他們不同的數據類型道歉,但解釋數組和指針的鏈接將是很好的幫助 – AAB

    0

    數組和指針在不同C.數據類型當陣列被用作與操作者sizeof一個操作數,它給陣列數據類型的大小。但是,當指針與sizeof運算符一起使用時,將返回指針的大小。

    標準表示(C11-6.5.3。4):

    運算符sizeof產生其操作數的大小(以字節爲單位),該操作數可以是表達式或類型的括號化名稱。 大小取決於操作數的類型。

    類型在第一種情況下的操作數a的是int [12]而操作數在第二種情況下,類型是int *

    0

    您會得到不同的答案,因爲在這兩種情況下a是不同的。

    int a[12]; - 在這種a是一個數組,

    int *a = malloc(12*sizeof*a); - 在這種a是一個指針。


    指針和數組可以互換最多的地方使用,但並不意味着他們是同樣的事情。兩者都有不同的屬性(如Sourav解釋)。

    0

    sizeof運營商處理的尺寸爲類型它不需要對傳遞給它的操作數所持有的內容做任何事情

    int a[12]作爲int [12]類型,因此給出大小48(4*12)

    但是int *a是整數指針和sizeof操作者給指針(4)的大小。

    在這些情況下int a[12]int *a都不相同。 請注意,sizeof是少數情況下數組不衰減到指針之一。

    相關問題