[英]Why are pointers not located on a stack?
void main(){
int i,k;
char* p;
int j;
printf("address of i is %d \naddress of k is %d \naddress of p is %p\naddress of j is %d", &i,&k,&p,&j);
}
當我嘗試上面的代碼時,j的地址比k低4個單位。 但是p的地址不在附近。 由於指針是一個可以存儲4個字節數據的整數變量,為什么不像其他三個變量一樣在堆棧上分配?
使用%p
打印所有地址。
擾流板:它是在棧上。
你應該發布你得到的輸出。 我懷疑你有點困惑,因為你正在打印的大多數地址都是以十進制顯示(使用%d)而p
是以十六進制顯示(使用%p)。
我剛剛在我的計算機上運行了你的代碼(運行Ubuntu 9.04)並獲得了以下內容:
address of i is 0xbf96fe30
address of k is 0xbf96fe2c
address of p is 0xbf96fe28
address of j is 0xbf96fe24
稍微更改代碼后:
void main(){
int i,k;
char* p;
int j;
printf("address of i is %p \naddress of k is %p \naddress of p is %p\naddress of j is %p\n", &i,&k,&p,&j);
}
由於你所有的printf()都是地址,你應該使用%p而不是%d。 也許你誤解了你的結果?
我不能不告訴你,你的程序是“應該縮進六英尺並且被泥土覆蓋”的程序之一。 (google為誰說的時間和原因:-)由於以下原因,這是草率的一個主要例子,其中大多數都導致了未定義的行為:
正確編寫它看起來像這樣:
#include <stdio.h>
int main (void)
{
int i, k;
char *p;
int j;
printf ("address of i is %p\n", (void *)&i);
printf ("address of k is %p\n", (void *)&k);
printf ("address of p is %p\n", (void *)&p);
printf ("address of j is %p\n", (void *)&j);
return 0;
}
當您使用%d
printf()
說明符時,您將獲得一個打印為十進制數的地址,當您使用%p
說明符時,您將其打印為十六進制數。 恰好十六進制數字不包含任何字母而你誤解了它。
最后一個指針是一個變量。就linux架構而言,很明顯
所有那些內存本地化為函數的變量都將保留在堆棧中
沒有理由為什么對於上面的情況,指針不應該在堆棧上。這是一個錯誤解釋輸出並忽略來自gcc的警告的情況。這是一個初學者的情況,他們忽略gcc警告是無害的。有些情況下他們等同於編譯器錯誤
指針可能位於堆棧上,也可能不位於堆棧中,因為它們也是某種變量。 請注意,它們是一些不是很大的變量。 如果CPU / MCU有很多寄存器並且編譯器優化得很好,你可能看不到堆棧上的指針,它可能會在寄存器中花費整個生命周期。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.