2017-10-08 50 views
1

我明白爲什麼一個數組衰變時傳遞給函數沒有指定其大小爲指針,如:爲什麼當大小

void test(int array[]); 

爲什麼會做這麼過去了呢C數組衰變爲指針當通過大小?例如。

void test(int array[3]); 

我具有後一功能的簽名,這是令人沮喪的數組長度是在編譯時清楚知道下與sizeof麻煩。

+4

這就是語言如何被定義(並且已經很長時間了) - 要麼將大小作爲單獨的參數傳遞,要麼將數組嵌入到結構中,要麼切換到不同的語言。 –

+1

因爲這就是它的設計。我們可以給你一個歷史課,但它對你沒有多大幫助。 – user2357112

+2

這是代表語言設計者的優化。人們當然可以同意他們的看法,或者認爲回想起來還爲時過早。但這就是語言的設計。 – StoryTeller

回答

3
void test(int* array); 
void test(int array[]); 
void test(int array[3]); 

所有這些變體都是相同的。 C只是讓你使用替代拼寫,但即使最後一個變體顯式註釋數組大小衰減到指向第一個元素的指針。

也就是說,即使最後實現,你可以調用函數與任何大小的數組:

void test(char str[10]) { } 

test("test"); // Works. 
test("let's try something longer"); // Still works. 

有沒有神奇的解決方案,來處理這個問題的最易讀的方式是,要麼做一個struct與數組+大小或只是將大小作爲附加參數傳遞給函數。

LE:請注意,此轉換僅適用於數組的第一維。當傳遞給函數時,int[3][3]轉換爲int (*)[3],而不是int **

+0

所以int數組[3]比其他任何東西更適合程序員的利益嗎? – Dimpl

+0

在我看來,它不應該被使用。它可能會給用戶一種錯誤的安全感(「哦,這個函數只接受長度爲3的數組,所以我不需要自己檢查長度」)。 – Valdrinit

1

因爲您無法正確調用此功能。在幾乎所有上下文中,數組都會衰減到指向第一個元素的指針,並且在嘗試調用函數時,數組首先會轉換爲指針,並且調用將會不匹配。 不是衰減的唯一上下文是運營商sizeof,_Alignof,_Alignas&。這些更容易檢測句法。