2009-10-27 107 views
3
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的地址是4个单位K以下。但p的地址不在附近。由于指针是一个整数变量,可以存储4个字节的数据,为什么它不像其他三个变量一样在堆栈上分配?为什么指针不在堆栈上?

+1

一些正式的注意事项: - main()应该返回int - 使用printf()时,请务必在最后加上'\ n'。 – eyalm 2009-10-27 07:57:16

回答

11

你应该张贴你得到的输出。我怀疑,因为大多数你打印的地址都显示在小数点,你变得有点混乱(使用%d),而p在十六进制显示(使用%P)。

13

使用%p打印所有的地址。

剧透:这是堆栈上。

+1

请注意,您必须*将%p的每个参数转换为'(void *)'。到目前为止,所有代码示例都调用_undefined behavior_,因为格式说明符与参数类型不匹配。虽然它可能没有多大区别,但防弹代码使用'#include ','int main(void)'和'printf(“%p \ n”,(void *)&p);'等) – Jens 2011-07-18 20:11:59

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的地址。也许你误解了你的结果?

0

当您使用%dprintf()说明符时,您会得到一个打印为十进制数的地址,并且当您使用%p说明符时,会将其打印为十六进制数字。它只是发生,十六进制数字不包含字母,你误解了它。

-1

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

+2

在OPs案例编译器无法优化指针变量,因为代码希望获取变量(&p)的内存地址,该变量对一个寄存器无效。 – 2009-10-27 08:23:05

+0

@Frank:我指的是问题(标题本身),而不是给定的代码片段... – Malkocoglu 2009-10-27 09:29:14

+0

这是一个罪过来详细说明问题:-) – Malkocoglu 2009-10-27 09:36:24

0

到底指针是variable.As远的Linux架构而言,它很清楚,

所有这些变量,它们的内存定位于一个功能将保持在堆栈中。 <

没有理由针对上述案例中的指针不应该在stack.Its,他们忽略了海湾合作委员会警告曲解输出中和从gcc.Its无视警告与初学者的情况的情况下,作为harmless.There是当他们相当于一个编译器错误

0

我不能不告诉你,你的计划是那些1例“应缩进六英尺布满灰尘。” (谷歌谁说,这时候,为什么:-) 这是sloppyness的,原因如下,其中大部分是导致未定义行为一个最好的例子:

  • 用途的printf,而不包括标准输入输出。^ h
  • 使用无效的主要
  • 用途的地址%d
  • 用途%P比其他东西PTR到无效

正确写它看起来像这样:

#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; 
}