2013-08-26 32 views
-2

使用此代碼:字符指針數組的大小從功能

#include <stdio.h> 

void printSize(char *messages[]) { 
    printf("%d", sizeof(messages)/sizeof(char *)); 
} 

int main(void) { 

    printf("Size when through passing direct to function: "); 
    printSize((char *[]){"Zero", "One", "Two", "Three"}); 
    printf("\n"); 

    printf("Size when calculating in main: %d\n", sizeof((char *[]){"Zero", "One", "Two", "Three"})/sizeof(char *)); 

    return 1; 
} 

我得到的輸出:

Size when through passing direct to function: 1 
Size when calculating in main: 4 

我知道有沒有辦法讓一個char *數組元素的正確量,但我很好奇他們爲什麼會給出不同的結果。

+2

數組衰變成指針。你在第一個例子中獲得指針的大小。 – Brian

+0

這不是重複的。我在問爲什麼會給出不同的答案,而不是如何獲得數組中元素的數量。 – Jimmay

回答

2

當您使用數組作爲函數的參數時,它將「衰變」爲指向數組的第一個元素的指針。由於messages是一個指向char的指針數組,因此當數組傳遞給函數時,它將成爲指向char的指針。即使您將其指定爲參數列表中的數組,也會發生這種情況;這就是語言的工作原理。

所以在void printSize(),當你使用sizeof(messages)時,你會得到一個指針的大小。您將它除以另一個指針sizeof (char*)的大小。在你的系統上,這兩種情況下指針的大小都是4字節,所以你得到的結果是4/4,即1.

然而,在main()中,你的數組char*被定義爲,並被視爲, 數組。將sizeof()運算符應用於數組時,將得到整個數組中所有字節的大小。這是一個什麼樣的數組?這是一個指向char的四個指針陣列。每個指針的大小爲4.所以數組的總大小是4 * 4 = 16個字節。你將這16個單指針的大小除以4,所以你得到的結果是16/4,即4作爲main()中的答案。

+0

更清晰的答案,直接關係到我所問(沒有粗魯)。謝謝,標記爲正確。 – Jimmay

+0

一個小問題是,寫(char **消息)而不是(char *消息[])是更好的做法,因爲第一個會衰減到第二個。 – Jimmay

+2

這是一場宗教戰爭。有些人說'char ** messages'更好,因爲它更確切地代表被調用函數接收到的參數。其他人說'char * messages []'更好,因爲它更精確地代表了調用函數的角度來看參數。我不參加宗教戰爭。 :-) – verbose

4
  1. 這是因爲char *messages[]只是爲char **messages語法糖,讓你剛剛一個指針,而不是你的整個陣列的尺寸大小。

  2. 如果不將大小作爲另一個參數傳遞,則不能。

您應該查看Arrays & Pointers上的comp.lang.c FAQ部分。

+0

感謝您的回答,但我仍不明白爲什麼兩者都給出不同的數字。 – Jimmay

+2

您是否閱讀過鏈接?特別是[6.21](http://c-faq.com/aryptr/aryparmsize.html)?這實際上就是*你的問題。 –