[英]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.