2015-05-19 176 views
2

假設存在數組A,使得它的元素是struct Element,並且我被告知struct Element沒有填充。根據指向第一個和最後一個元素的指針計算數組中的元素數

如果我給出指向A中第一個和最後一個元素的指針,我可以根據指針的地址和元素佔用的內存量來確定A中元素的數量嗎?或者內存中的數組結構不能像那樣工作。

我的想法是,如果我給出的指針元*開始和元*完成...

number of elements = (finish - start)/sizeof(Element) 

這是邏輯思維?

回答

7

如果您有:

Element* start; // first element 
Element* finish; // last element 

然後:

numElements = finish - start + 1; 
  1. 如果finish就像STL的end,你沒有+1
  2. 由於指針運算的,你沒有通過sizeof(Element)

劃分對於考慮是否有可能是在構件端部填充,比利表示,sizeof已經包含,如將指針運算。從C++ 14最後草案:

N3797/5.3.3/2 [的sizeof]

當應用於一類,結果是字節在該類的一個對象 包括數將該類型的對象放置在數組中所需的任何填充。

+0

請注意,STL中的「結束是一個*過去*結束」行爲允許範圍表示空範圍'start == end'。 –

+1

RE:你的更新:C要求在對象之間不要插入填充,並且在數組中包含任何必要的填充以將它們排列在它們的'sizeof'中。例如'sizeof(struct {int I; char c;}}''通常是'sizeof(int)* 2' –

+0

@BillyONeal。謝謝,聽起來正確; C++必須是相同的?我試圖記住這些保證 – Keith

0

當您使用指針算術時,可以說「單位」是指向類型的一個元素的大小。

I.e.如果指向Element* start指向數組的第0個元素,則start + 1將指向該數組的第1個元素。

因此,當您使用finish - start時,您已經獲得它們之間的元素數量,並且不需要用sizeof(Element)進行除法。

+0

注意:指針運算的這種行爲可以給出令人驚訝的結果,例如,指向數組的指針和指向數組的第0個元素的指針有效地指向相同的位置,但是遞增前者會讓你跳過數組,並且遞增後者會讓你進入數組的第一個元素。 – Mints97

相關問題