2012-02-23 50 views
39

可能重複:
Sizeof an array in the C programming language?
Why does a C-Array have a wrong sizeof() value when it's passed to a function?如何獲取C中數組的長度? 「sizeof」是一種解決方案嗎?

請參見下面的代碼,並建議我那是什麼的 「的sizeof」 關鍵字的區別,當我用這樣的:

#include<stdio.h> 
#include<conio.h> 
void show(int ar[]); 
void main() 
{ 
    int arr[]={1,2,3,4,5}; 
    clrscr(); 
    printf("Length: %d\n",sizeof(arr)); 
    printf("Length: %d\n",sizeof(arr)/sizeof(int)); 
    show(arr); 
    getch(); 
} 
void show(int ar[]) 
{ 
    printf("Length: %d", sizeof(ar)); 
    printf("Length: %d", sizeof(ar)/sizeof(int)); 
} 

但輸出是這樣的:

輸出是:

長度:10

長度:5

長度:2

長度:1

爲什麼我變得這樣;如果我想從一個陣列到另一個陣列的整個數據,我該怎麼辦?

建議我如果有人知道。

+1

無法獲取C中數組的大小而沒有更多信息。 – m0skit0 2012-02-23 12:31:35

+0

@Oli Charlesworth:我在谷歌搜索,但我沒有得到你提供的鏈接;感謝您的提供; – alishaik786 2012-02-23 12:41:30

+0

您無法獲取數組參數的大小。 – 2014-09-07 13:50:04

回答

60

將數組衰減爲函數調用中的指針。無法以任何方式計算僅以指針表示的數組的大小,包括使用sizeof

您必須添加一個明確的說法:

void show(int *data, size_t count); 

在通話時,您可以使用sizeof來計算元素的數量,實際陣列:

int arr[] = { 1,2,3,4,5 }; 

show(arr, sizeof arr/sizeof *arr); 

注意sizeof給你大小以char爲單位,這就是爲什麼需要根據本質上sizeof (int)進行劃分的原因,否則你會得到太高的價值。

另請注意,作爲興趣點和清潔度,sizeof而不是函數。只有當參數是一個類型名稱時才需要括號,因爲參數是一個類似演員的表達式(例如sizeof (int))。您通常可以在沒有命名實際類型的情況下離開,通過對數據執行sizeof來代替。

+1

show(arr,sizeof arr/sizeof * arr); – Soran 2014-09-05 18:21:30

+0

@Soran謝謝,修正! – unwind 2014-09-07 13:43:07

+0

雖然我認爲這是最好的通用解決方案 - 即傳遞長度和數組 - 我認爲還值得注意的是,對於靜態數組(即在程序執行期間長度不變),最簡單的解決方案是設置數組大小在源代碼中使用#define預處理器定義。例如。 #define ARRAY_SIZE 5 – Bill 2015-05-31 20:42:12

1

show()獲取存儲在2個字節上的數組的地址。把它想成int * ar。

2

這就是爲什麼在編寫一個接受數組的函數時聲明兩個參數的原因。一個是指向數組的指針,另一個指定數組的大小。

相關問題