2011-08-26 89 views
0

可能重複:
Is it possible to find out the variable name, the pointer pointing to?是否有可能找出變量名稱,指向的指針?

是有可能得到數組名指針指向呢?

例如:

char name[20]; 
char *p=name 
int door_no; 
int *q= & door_no 

在我們給用數組名和指針q指向數組的基址door_no但如果,我有什麼要知道變量的名稱上面的例子數組指向了嗎?什麼是變量名指針q也指向?有沒有可能我做了嘗試,我得出了一個結論:不可能,但Iam試圖找到解決方案。你認爲什麼人?有什麼辦法可以做到嗎?

+0

可能嗎?取決於編譯器/ RTE。但我想在C中你的機會是有限的。可能不會。這是一個stackoverflow問題。 – Falcon

+0

以及我一直在嘗試它。我甚至認爲它不可能,但仍然讓我知道背後的任何原因。是什麼讓它不可能 – niko

+0

代碼在運行時缺少關於符號的信息。如果符號以某種方式在二進制文件中,您可能能夠提取它們並將它們與內存地址相關聯。但是,我不認爲是這樣。 – Falcon

回答

8

簡短的回答:第

龍答:

在C不編譯後存在的變量名(一切都被轉換成任何存儲位置或寄存器位置)。

如果兩個對象的壽命不重疊,編譯器可能會將多個變量分配給同一內存/寄存器位置。因此,變量名在運行時的概念沒有意義(在C的情況下)

+1

爲了給出最後一段的一個例子,假設兩個函數A和B將局部變量的指針傳遞給函數D.如果順序地調用A和B,局部變量可能在內存中完全相同的點上,但是名稱和類型可能不同。 –

1

不,這是不可能的。您的指針將地址保存到內存中的空間。變量名稱是您定義的名稱,表示內存中的空間。所以,你有這樣的東西:

name -> mem space 
q ------^ 

沒有什麼連接q到名稱,他們不會倒退。他們兩人都會讓你進入記憶空間,但你不能映射回他們。此外,該程序不知道這些碰巧映射到相同的東西!你知道的唯一原因是因爲你設置了它。

0

這開始作爲一個評論,但後來我意識到它可能更好地作爲一個實際的答案。

所述問題的簡短回答是,正如其他人已經指出的那樣,,您無法將內存位置映射到對應於該位置的變量名稱。

想想看會發生什麼,如果它真的有可能做你想要的東西。這是你的一個想法實驗。我假設C,但它應該同樣適用於任何支持指向任意內存位置的指針的語言(包括其他變量佔用的內存位置)。

假設你有兩個指針開始了一個相同的內存位置:

char p[] = DUMMY; 
char *q = &p; 

現在,如果你以某種方式去解引用&q,你會得到p。好吧,從理論的角度來看,這種工作很有用。現在,添加:

char *r = &q; 

現在,你有雙重間接。如果你試圖找出名字指向名字p的同一個內存位置,結果如何?如果我記得指針的語法正確,你會得到*q*(*r)。編譯器如何告訴你,特別是在運行時?

假設p[]足夠大。對於任意數量的n,更換*q分配方式:

char *q = &p + n; 

什麼是現在的類似去提領q結果呢?如果q現在超出p[]的範圍,結果會是什麼? (好吧,後者可能只是q,但那有什麼意義呢?)

或者,在圖形用戶界面廣泛出現之前,這種做法相當普遍。試試這個(不要介意實際的地址)。

short *videomemory = 0xB8000; 
/* and then, at some later point... */ 
videomemory += 4; 

然後,嘗試尋找對應於videomemory的值的地址(0xB8004,在上述的)。結果是什麼?原則上,「陣列」videomemory[]無限延伸,甚至環繞(讓我們暫時忽略內存保護),因此任何東西將映射到內存「佔用」videomemory[],只有足夠大的數組索引。

1

這是可能的,但僅限於原始對象的範圍內。

你給了這些例子(我稍微修改了格式):

char name[20]; 
char *p = name; 
int door_no; 
int *q = &door_no; 

你可以做比較,相當於你的任務,即:

if (p == name) 
    printf("p == name\n"); 
if (q == &door_no) 
    printf("q == &door_no\n"); 
0

這是不可能得到變量的名稱pq指向傳統編譯和執行程序的原因,因爲編譯器所做的一件事是忘記變量的名稱,只保留地址。

根據您要做的事情,您可以在保留名稱的非傳統執行環境中執行該程序。例如,

 
~ $ cat t.c 
main(){ 
char name[20]; 
char *p=name; 
int door_no; 
int *q= & door_no; 
} 
~ $ frama-c -val t.c 
[kernel] preprocessing with "gcc -C -E -I. t.c" 
... 
[value] ====== VALUES COMPUTED ====== 
[value] Values for function main: 
      p ∈ {{ &name ;}} 
      q ∈ {{ &door_no ;}} 
      __retres ∈ {0; } 
相關問題