2011-11-24 61 views
0

我剛剛開始學習C++,所以我相當肯定答案可能很簡單。作爲一個測試,我只是建立一個數組,然後想通過循環來打印數組。C++數組/循環出了什麼問題?

我的代碼如下。它按預期打印出我的數組,但打印出下面的其他數字。這些數字是什麼,它們來自哪裏?我懷疑'sizeof'不是最好用的。我發現的所有例子都比我需要的更復雜。無論如何,我有興趣瞭解額外的數字。任何洞察力可用?

int age[4]; 
age[0]=23; 
age[1]=34; 
age[2]=65; 
age[3]=74; 

for (int i = 0; i <= sizeof(age); i++) 
    cout << age[i] << endl; 
return 0; 

...輸出:

23 
34 
65 
74 
4 
2147307520 
0 
2293608 
4198582 
1 
3084992 
3085608 
-1 
2293592 
1980179637 
-725187705 
-2 
+0

除了正確使用'sizeof'所提出的觀點外,請注意您應循環播放,而索引嚴格小於數組大小,不能小於或等於。當索引等於數組大小時,您不希望運行循環,因爲該索引不存在。 (你用來設置數組值的代碼應該給你提示;)) –

回答

4

sizeof給出一個對象的大小字節。如果數組元素大於一個字節(通常是int),則數字將大於數組大小。獲取數組中元素的個數

一種方式是通過一個元素的大小來劃分:

for (size_t i = 0; i < sizeof(age)/sizeof(age[0]); i++) 
    std::cout << age[i] << '\n'; 

(請注意,您還需要<而非<=,或者你還是會走下結束)。

另一種方式是通過一個參考陣列到功能模板,實例化數組大小:

template <typename T, size_t size> 
void print(T (&array)[size]) 
{ 
    for (size_t i = 0; i < size; ++i) 
     std::cout << array[i] << '\n'; 
} 

print(age); 

還有一種方法是使用一個std::vectorstd::array代替普通數組:

std::array<int, 4> age; 
age[0]=23; 
age[1]=34; 
age[2]=65; 
age[3]=74; 

for (size_t i = 0; i < age.size(); ++i) 
    std::cout << age[i] << '\n'; 
+1

原稿的錯誤原因是什麼? –

+0

謝謝大家的回覆,我現在明白這一點,爲邁克徹底回答歡呼。 – Exbi

+0

@ K-ballo:很好的地方。 –

0

要高度重視是因爲i < 4sizeof(age) 16一32位機器上。

+0

感謝你的回覆,它解釋了額外的數字。我想知道如果我不知道它的大小,我將如何循環訪問該數組? – Exbi

+0

邁克西摩回答了這個問題。 –

+0

@Exbi:但是你*總是知道數組的大小,因爲數組是一個編譯時固定結構。如果你的數據結構必須動態增長,你不能使用數組(你需要像'std :: vector')。 –

2
sizeof(age) == sizeof(int) * number_of_elements ==> 
    number_of_elements = sizeof(age)/sizeof(int) 

那麼你的代碼變成:

for (int i = 0; i < sizeof(age)/sizeof(age[0]); ++i) 
    cout << age[i] << endl; 

在C++中,你可以編寫一個函數來計算大小爲您(不帶動態數組工作):

template <class T, std::size_t size> 
std::size_t array_size(T(&arr)[size]) 
{ 
    return size; 
} 

如果您可以使用C++ 11,您可以使用for-each循環:

for(int element : age){ 
    .... 
} 

此外,標準的自由函數形式::開始和std ::端可以做的工作:

for(auto b = std::begin(age); b != std::end(age); ++b){ 
    .... 
} 
0

sizeof(age)age字節數,而不是元素的數量。

把它通過age元素的大小,得到的是:

for (int i = 0; i < sizeof(age)/sizeof(*age); i++) 
    cout << age[i] << endl; 

注:動態數組,你必須單獨的存儲陣列的大小:

std::size_t size = 4; // size_t corresponds to maximum size an array can hold 
int* age = new int[size]; 
for (int i = 0; i < size; i++) 
    cout << age[i] << endl; 

其他數字是數組末尾的垃圾。

age[10]是未定義的行爲,它基本上是垃圾數。

0

Sizeof是年齡數組是16字節I.e. Sizeof(int)* 4.您需要數組長度。

0

由於sizeof(age)返回16,因此您有4個值加上12個值,它們的值來自緊跟在數組之後的內存。這些內存段中的值是隨機的,取決於在啓動程序之前存儲在那裏的內容。如果你使用了內存檢查工具,那麼你應該有一個錯誤,因爲這個內存可能沒有被分配給你的程序。正如其他人所說的,你應該給出數組中元素的確切數量作爲附加變量。

const int COUNT = 4; 
int age[COUNT]; 
age[0]=23; age[1]=34; age[2]=65; age[3]=74; 
for (int i = 0; i < COUNT; ++i) 
{ 
    cout << age[i] << endl; 
}