2012-04-05 22 views
1

如果我按照以下方式編寫它,則返回結果爲1.不明白爲什麼?預期的答案是5.char * list []返回長度爲C和C++的疑問

int main() 
    { 
     const char* list_of_filename[] = {"One","Two","Three","Four","Five"}; 

     printf("%d", countFiles(list_of_filename)); 

     return 0; 
    } 

    int countFiles(const char* list_of_filename[]) 
    { 
     return sizeof(list_of_filename)/sizeof(list_of_filename[0]); 
    } 

回答

4

sizeof只適用於您聲明數組的範圍。在C中,不能傳遞數組。所以:

int countFiles(const char **list_of_filename) 

所以你比較兩個指針的大小:

int countFiles(const char* list_of_filename[]) 

因爲是完全一樣的。 const char *const char **的大小在您的系統上相同。

answer(由Michael毛刺,但是從鉻原本)提供了一個宏,做數組大小的計算,和錯誤的一些無效構建體是這樣的(但不是這一個)

2

作爲函數參數,

const char* list_of_filename[] 

實際上意味着:

const char** list_of_filename. 

因此,你實際上計算是什麼:

sizeof(char**)/sizeof(char*) 

char**char*都只是指針,因爲所有指針一般具有相同的尺寸(至少在這種情況下,對你來說,這兩個做):

x/x 
= 1 


編輯:當將數組傳遞給C中的函數時,通常要麼傳遞數組的大小,要麼用特定的值終止數組,以便能夠確定它的長度。

+0

優秀的解釋! – 2012-04-05 03:58:00

+0

@AdamLiss:乾杯。 – AusCBloke 2012-04-05 03:58:27

1

從C標準(C11 6.3.2.1 Lvalues, arrays, and function designators, para 3):

除了當它是sizeof運算符,所述_Alignof操作者,或 一元&操作者的操作數,或是用於初始化數組文本的字符串,具有 類型的數組的類型的表達式被轉換爲類型爲''的指針的類型爲''的表達式,該指針指向數組對象的初始元素 ,並且不是左值。

換句話說,當你將該數組傳遞給一個函數時,它將變成一個指向數組第一個元素的指針,因此它的大小就是指針的大小。

如果你想要把它作爲函數中的數組,你需要在尺寸信息明確地傳遞的東西,如:

void printArray (int *arr, size_t sz) { 
    for (size_t i = 0; i < sz; i++) 
     print ("%d ", arr[i]); 
    puts (""); 
} 
: 
int xyzzy[] = {3,1,3,1,5,9,2,6,5,3,5,8,9}; 
printArray (xyzzy, sizeof (xyzzy)/sizeof (*xyzzy)); 
+1

xyzzy?你處在一個曲折的小陣列迷宮中,都是一樣的。 :-) – 2012-04-05 03:59:34

+0

@Adam,祝賀我成爲第一個認識這個參考的人,儘管我現在已經使用了xyzzy和plugh幾個月了。作爲一個獎項,你會得到三個答案的隨機提供,只要我能找到三個值得的:-) – paxdiablo 2012-04-05 04:01:46

+2

什麼,用你的赤手? Plugh! (我想我們都展現了我們的年齡吧?) – 2012-04-05 04:03:34

0

C數組和指針是不一樣的!

新手C程序員經常聽到的第一件事之一是「數組與指針相同」。不幸的是,這是一個危險的半真相。 ANSI C標準的段落6.5.4.2建議您

注意的聲明之間的區別:

extern int *x; 
extern int y[]; 

首先申明x爲int的指針;第二個 聲明y是一個未指定大小的int數組(一個不完整的 類型),其存儲在其他地方定義。

該標準沒有詳細討論這個問題。

所以,當您嘗試從陣列得到sizeof返回以字節爲單位的整個陣列的大小(對象的大小之和),當你試圖讓指針sizeof - 它以字節爲單位返回指針的大小。指針的大小在一個平臺上始終保持不變。通常它是4或8個字節。

請記住這個:)