2013-05-02 45 views
2

我寫了一個功能:傳遞數組功能沒有給予正確的答案

string par(int a[]){ 
int s=sizeof(a)/sizeof(*a); 
cout<<s<<endl; 
/* 
    ..do something 
*/ 

}

主要功能是寫爲:

nt main(){ 
int a[]={1,5,11,5}; 
cout<<sizeof(a)/sizeof(*a)<<endl; 
cout<<par(a)<<endl; 

}

輸出我得到的是:

而我相信它應該是相同的,因爲我通過相同的數組。請指出錯誤..謝謝..

+1

當傳入函數時,數組衰減爲指針。這可能是你所看到的 – 2013-05-02 17:57:32

+0

這不是C++嗎? – squiguy 2013-05-02 18:02:40

+0

@squiguy:是的。主要區別在於,使用C++時,可以使用標準庫「vector <>」,它可以*提供您的大小。 – paulsm4 2013-05-02 18:54:23

回答

2

在C++中,當一個數組作爲參數傳遞給一個函數時,實際上你傳遞了一個指向數組的指針。由於指針和int的大小是4或8(取決於ABI,因爲你得到1,那麼我想你有一個32位機器),你得到的是4/4,這是1 。

所以

int s=sizeof(a)/sizeof(*a);爲1

你應該通過大小作爲參數,而不是試圖計算出它裏面的函數:

string par(int a[], int size) 
+0

感謝您的評論和答案..但幫助我解決這個..我的意思是我需要能夠找到出路訪問所有元素在大小的陣列... – ejjyrex 2013-05-02 18:01:33

+0

正如我在我的答案,你應該把這個大小作爲一個參數。 – Maroun 2013-05-02 18:02:05

+0

@downvoter,任何評論,所以我可以從我的錯誤中學習?..... – Maroun 2013-05-02 18:05:04

1

你的東東d通過在陣列到函數的大小,則不能從計算大小「×[]」:

string par(int a[], int size){

1

傳遞string par(int a[])實際上沒有傳遞數組但傳遞數組的地址即string par(int *a) 。所以函數不知道有4個元素的數組已經通過。它知道已經傳遞了一個指向整數數組的指針。因此該函數返回1作爲數組大小。

1

見問題6.46.21在C FAQ

問:爲什麼不和sizeof正確時,陣列是一個函數參數報告數組的大小?我有常規

f(char a[10]) 
{ 
    int i = sizeof(a); 
    printf("%d\n", i); 
} 

測試和它打印4,不10.

答:編譯器假裝數組參數被聲明爲指針(即,在該示例中,爲char *一;請參閱問題6.4),sizeof報告指針的大小。另見問題1.24和7.28。

這是7.28說:

問:爲什麼不sizeof告訴我的內存塊的一個指針指向的大小?

答:sizeof告訴你指針的大小。沒有便捷的方法來找出malloc塊的大小。 (請記住,sizeof在編譯時運行,也可參見問題7.27。)

+1

這是對簡單回答「C不存儲元數據(如數組大小)以及數組」的過於複雜的回覆。所有子程序看到的都是一個指針 - 這還不足以確定大小。我可能有點過於謙虛, Maroun Maroun給出了一個很好的解釋。恕我直言...... – paulsm4 2013-05-02 18:51:58

+0

@ paulsm4:最好給出一個解釋,不僅僅是爲了OP,而是爲了其他的互聯網。這個問題在這裏得到了回答,即使它不是被接受的。它解釋了OP所看到的差異以及爲什麼sizeof報告不同的大小。 – 2013-05-02 18:53:06