首先,請不要更新代碼來修復錯誤,而問題是打開的。它使大多數當前的答案毫無意義,不會因爲解決了您之前的代碼中的一個或多個問題的人而給予信用,並且會讓臨時讀者尋找與他們自己完全混淆的相關問題無論是問題還是其中的答案。如果你想修改一個更新,可以在增加來解決原來的問題,但是如果它是一個完全不同的問題,那麼標記爲已回答,給出它應該到的地方,並用你的新代碼和不同的問題開一個新的問題(理想情況下,無論如何)。
正如現在寫的,你的功能沒問題。但是,你真正的問題是這樣的:
// compile with -Wall -Werror and look at the warning here
int v={10,12,20,34,45}; // <== WRONG
getelements(&v,5); // <== Harmless, but bad form.
這應該是這樣的,而不是,假設你要打印陣列中的所有元素:
int v[] = {10,12,20,34,45};
getelements(v, sizeof(v)/sizeof(v[0]));
注意[]
下你的陣列。沒有它,&v
屏蔽了編譯器的一個大胖警告或錯誤,int
被傳遞爲int *
。此外,如果您有(-Wall -Werror
海合會)視爲錯誤滿警告編譯之前的代碼,你會得到一個錯誤,如您v
報關行:
main.c:116:15: Excess elements in scalar initializer
換句話說,一切都會過去的第一要素是忽略了,因此你的指針就跑進了未定義的行爲區域。將聲明和調用更改爲我上面的內容將解決此問題,並確保您不會再犯這個錯誤,因爲sizeof(v[0])
甚至不會編譯,除非v
是數組或指針類型。後者在使用指針而不是陣列進行計算時仍然會引起頭痛,但這就是您必須嚴格控制自己不要在C中做的事情。
不應該是int'v [] = {。 ..''? – John3136
您可能會注意到,'p =&a [0]'可以寫成'p = a',因爲它與'&(* p)'或'&(*(p + 0 * sizeof(int))類似)',我想。 – musicmatze