2010-11-25 113 views
3

我碰巧問自己一個關於C++數組的問題。 那麼,我們都知道數組是固定的東西集合,我說是固定的,因爲在定義數組時需要聲明數組的長度。 好吧,讓我們考慮一個例子:處理數組大小

char myarray[10] = {'\0'}; 
int sz = sizeof(myarray); // It is supposed to be 10 

嗯,這是正確的,10是返回的sizeof的數量。這可以由編譯器完成,因爲他知道它爲該變量放置了多少空間。

現在考慮在這種情況下會發生什麼:

void dosome(mystruct* arr) { 
    int elements = sizeof(arr)/sizeof(mystruct); 
    for (int i = 0; i < elements; i++) { 
     // Do something hoping no overflow will ever occur 
    } 
} 

尼斯......但我想這可能是溢出容易。如果我將這個函數傳遞給我以「正常」方式創建的數組,則一切都應該很好:

mystruct array[20]; 
dosome(array); 

沒問題。但是,如果我這樣做:

mystruct* array = (mystruct*)malloc(80*sizeof(mystruct)); 
dosome(array); 

發生什麼??????????????????? 我想了解sizeof的行爲,這個函數是在編譯時評估的嗎?好的,當我不使用數組時,會發生什麼情況,但像那樣的數據塊非常麻煩?此外,我可以重新調用它,再次調用malloc,並要求再次處理該數據塊。它會起作用嗎? 我可以嘗試一下身體,但是我會得到一些有關sizeof行爲的確切答案。

謝謝。

+2

在`dosome`,`的sizeof(ARR)`是`的sizeof(MYSTRUCT *)`不管如果你用C開發的功能被稱爲 – icecrime 2010-11-25 14:07:32

+0

方式++,然後儘可能使用`new`而不是`malloc`。如果你像這樣定義你的數組,你的代碼仍然行爲不端:`mystruct * array = new mystruct [20];`? – suszterpatt 2010-11-25 14:10:07

+0

icecrime是對的,你有錯誤的期望 – Simone 2010-11-25 14:10:20

回答

1
void dosome(mystruct* arr) { 
    int elements = sizeof(arr)/sizeof(mystruct); 
    for (int i = 0; i < elements; i++) { 
     // Do something hoping no overflow will ever occur 
    } 
} 

arr在這個例子中有什麼類型? mystruct*!它的大小最有可能是4或8.如果你想通過靜態/自動分配的數組(不是new'd)來保存大小,以便你的技巧可以工作,請通過REFERENCE!

template <int N> 
void dosome(mystruct (& arr) [N]) { 
    for (int i = 0; i < N; i++) { 
     // Do something . No overflow will occur 
    } 
} 

還應注意這個

int a[20]; 
sizof a; //equals to 20*sizeof(int) 
int* b = new int [20]; 
sizeof b; //equals to sizeof pointer, most likely 4 
2

mystruct array[20]例子開始是錯誤的。由於該函數接收的是指針類型,而不是數組類型,因此無法推導出數組中元素的數量。當您執行sizeof(arr)時,您實際上得到的尺寸爲mystruct*

可以使用模板來編寫以數組爲參數的函數,但是如果我沒有錯,C++中的建議方法是使用vector

該「辦法」接受數組作爲參數,將寫類似:

template <int N> void somefunction(int (&v)[N]); 

編輯修正函數聲明。哎呀。

0

sizeof是一個編譯時操作符。在這裏它只計算一個指針的大小。