我定義了兩個函式 foo1、foo2 和 foo3,每個函式接收一個引數 (xval),(yval) 并且我還在每個函式 (x),(y) 中宣告了一個變數。為什么在列印 x 地址和 y 地址時。我發現地址是不變的。xval, yval 給出了同樣的原因。
這是代碼:
#include <stdio.h>
void foo1(int xval) {
int x;
x = xval;
printf("X Address == 0x%x, Value of x == %d\n", &xval, x);
}
void foo2(int dummy) {
int y = dummy;
printf("Y Address == 0x%x, Value of y == %d\n", &dummy, y);
}
int main() {
foo1(7);
foo2(11);
return 0;
}
uj5u.com熱心網友回復:
在foo1和foo2 中,您將列印出放置在堆疊上的區域變數(分別為 xval 和 dummy)的地址。
如果我沒記錯的話,C 規范不要求這些區域變數具有不同的地址。這也不應該讓你擔心。
這些變數的地址僅在定義該變數的函式內有意義,因此比較兩個不同函式的地址是沒有意義的。
從技術上講,在呼叫foo1()之前,編譯器已將7放在main()函式的堆疊中。然后 foo1() 列印出該變數在堆疊中的地址。
當foo1()完成時,變數從堆疊中彈出,然后在呼叫foo2()之前將11放在堆疊上。這意外地使用了相同的記憶體地址,但您不應該指望這一點。例如,如果您從foo1() 中呼叫foo2()這將影響堆疊并且地址將不同。請嘗試以下操作:
#include <stdio.h>
extern void foo2(int dummy);
void foo1(int xval)
{
int x;
x = xval;
printf("X Address == 0x%x, Value of x == %d\n", &xval, x);
foo2(11);
}
void foo2(int dummy)
{
int y = dummy;
printf("Y Address == 0x%x, Value of y == %d\n", &dummy, y);
}
int main()
{
foo1(7);
return 0;
}
綜上所述,不要試圖分析具體的地址值是什么。只需使用該地址而無需查看它。這是平臺和編譯器相關的。
uj5u.com熱心網友回復:
xval和dummy是臨時變數。(“自動變數”是它們的 C 術語。)它們只保證在函式執行時存在。所以沒有理由他們不能在同一個地址。
在您的標準家用計算機上,可以在堆疊中找到它們。鑒于它們都是函式的第一個引數,并且函式是按順序呼叫的,如果它們沒有相同的地址,我會感到驚訝。
實際上,如果您不獲取引數的地址,則完全有可能使用暫存器將引數傳遞給函式,從而根本不會使用任何記憶體。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/348433.html
上一篇:InvalidOperation:[<class'decimal.ConversionSyntax'>]在Lambda函式python中
