为什么指针不在堆栈上?

时间:2009-10-27 06:59:51

标签: c pointers

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个字节数据的整数变量,为什么它不像其他三个变量那样在堆栈上分配?

7 个答案:

答案 0 :(得分:13)

使用%p打印所有地址。

Spoiler:堆栈上

答案 1 :(得分:11)

你应该发布你得到的输出。我怀疑你有点困惑,因为你正在打印的大多数地址都以十进制显示(使用%d),而p以十六进制显示(使用%p)。

答案 2 :(得分:6)

我刚刚在我的计算机上运行了你的代码(运行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。也许你误解了你的结果?

答案 3 :(得分:0)

当您使用%d printf()说明符时,您将获得一个打印为十进制数的地址,当您使用%p说明符时,您将其打印为十六进制数。恰好十六进制数字不包含任何字母而你误解了它。

答案 4 :(得分:0)

最后一个指针是一个变量。就linux架构而言,很明显

  

其内存已定位到函数的所有变量都将保留在堆栈中。<

对于上述情况,没有理由指针不应该在堆栈上。这是一个错误解释输出和忽略来自gcc的警告的情况。这是一个初学者的例子,他们忽略gcc警告是无害的。有些情况下它们等同于编译器错误

答案 5 :(得分:0)

我不禁告诉你,你的程序是“应该缩进六英尺并且被泥土覆盖的程序之一”。 (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;
}

答案 6 :(得分:-1)

指针可能位于堆栈上,也可能不位于堆栈中,因为它们也是某种变量。请注意,它们是一些不是很大的变量。如果CPU / MCU有很多寄存器并且编译器优化得很好,你可能看不到堆栈上的指针,它可能会在寄存器中花费整个生命周期。