簡體   English   中英

為什么指針不在堆棧上?

[英]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為誰說的時間和原因:-)由於以下原因,這是草率的一個主要例子,其中大多數都導致了未定義的行為:

  • 使用printf而不包括stdio.h
  • 使用void main
  • 使用%d表示地址
  • 使用%p而不是ptr-to-void

正確編寫它看起來像這樣:

#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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM