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个字节数据的整数变量,为什么它不像其他三个变量那样在堆栈上分配?
答案 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为谁说的时间和原因:-) 由于以下原因,它是草率的一个主要例子,其中大多数引起了不确定的行为:
正确编写它看起来像这样:
#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有很多寄存器并且编译器优化得很好,你可能看不到堆栈上的指针,它可能会在寄存器中花费整个生命周期。