2012-03-02 102 views
0

在GCC中編譯C代碼時,是否有任何方法可以保證堆棧變量將按照我聲明的順序出現在堆棧中(或按相反順序,無所謂對我來說)?我知道這是可以通過結構,但我寧願不使用它們。堆棧中變量的順序(GCC)

+5

爲什麼你想要這樣?而'struct'有什麼問題? – 2012-03-02 15:00:23

+0

可能重複的[可以C編譯器重新排列堆棧變量?](http://stackoverflow.com/questions/238441/can-ac-compiler-rearrange-stack-variables) – 2012-03-02 15:01:05

+0

我想演示一定的堆棧溢出問題時緩衝區和指針,並以某種方式定位。我不想使用結構體(相反,我不能),因爲有些變量是在內聯函數中聲明的,這些函數稍後會在主例程中調用。 – leetrobot 2012-03-02 15:03:08

回答

4

唯一的方法將是一個結構,其中包括所有變量以您喜歡的順序。

對於本地變量,編譯器可以按照任何適合她的順序自由地重新排序/重用變量。有些變量可能根本沒有內存位置,它們只能在寄存器中生存,其他變量將完全被優化。

+7

「......因爲它適合她」。所以你的編譯器是女性。有趣的:) – adelphus 2012-03-02 15:13:54

+0

@adelphus:好吧,他們也會讓英語中的女性成爲女性,這對於旁觀者來說同樣很奇怪 – 2012-03-03 09:37:04

+0

@adelphus:我想我和我的編譯器相愛。 – alecov 2015-10-06 14:08:58

0

如果您堅持不想使用struct,那麼您將不得不自己使用alloca()分配堆棧內存。但是,您需要在堆棧內存中手動管理本地變量。

我不會建議你這樣做。使用一個結構。

0

最可靠的方法是引導gcc使用gcc -S生成彙編語言輸出,並檢查彙編語言輸出以找出哪些變量放在哪裏。如果您沒有進行優化編譯,則變量可能不會被移除或重新排列,如果您爲每個局部變量分配不同的值,應該很容易找到每個變量。

我承認這不是很高科技。但是如果你想確保gcc生成的代碼能夠以特定的方式工作,你將不得不看看它生成的代碼...