指针与数组,静态变量与auto变量

#include <stdio.h>
int m = 0;
static n = 0;
int main(int argc,char *argv[])
{
        int a,b,c = 0;
        char *p0 = "p111111111111";
        static   char *p1 = "p111111111111";
        char *p2 = "p22222222222222";
        char p3[] = "p22222222222222";
        printf("p0:%p,p1:%p,p2:%p,p3:%p\n",p0,p1,p2,p3);
        printf("addr>>>p0:%p,p1:%p,p2:%p,p3:%p\n",&p0,&p1,&p2,&p3);
        return 0;
}


结果为:
linux : /home /dest /myprogram # . /test2
p0 :0x8048570,p1 :0x8048570,p2 :0x804857e,p3 :0xbfbcd414
addr >> >p0 :0xbfbcd428,p1 :0x804a014,p2 :0xbfbcd424,p3 :0xbfbcd414

p0:0x8048570,p1:0x8048570,p2:0x804857e,p3:0xbfbcd414
结果分析:
p1与p2地址相同,是因为编译时检测到是同一个常量串,常量串的地址是固定的,也只有一份拷贝。
所以p1与p2值相同,下面为符号表信息。
p2与p3地址不同,是因为p2保存的是地址,而p3虽然也表示地址,但是它是数组的地址,与&p3是等同的,
p3的地址为什么不是常量串的地址? 
是因为初始化数组时要对常量串进行拷贝,不是直接对常量串的引用!


addr>>>p0:0xbfbcd428,p1:0x804a014,p2:0xbfbcd424,p3:0xbfbcd414
结果分析:
p0与p1地址不同,是因为他们本身都是变量,p1为静态变量,而p0为栈区地址。
gram # objdump -s test2

test2:     file format elf32-i386
省略n行

 8048510 c3eb0d90 90909090 90909090 90909090  ................
 8048520 f3c39090                             ....            
Contents of section .fini:
 8048524 5383ec08 e837feff ff81c3c7 1a000083  S....7..........
 8048534 c4085bc3                             ..[.            
Contents of section .rodata:
 8048538 03000000 01000200 70313131 31313131  ........p1111111
 8048548 31313131 31007032 32323232 32323232  11111.p222222222
 8048558 32323232 32007030 3a25702c 70313a25  22222.p0:%p,p1:%
 8048568 702c7032 3a25702c 70333a25 700a00    p,p2:%p,p3:%p.. 
Contents of section .eh_frame_hdr:
 8048578 011b033b 28000000 04000000 88fdffff  ...;(...........
 8048588 44000000 b4feffff 68000000 38ffffff  D.......h...8...
 8048598 88000000 a8ffffff c4000000           ............    
Contents of section .eh_frame:
 80485a4 14000000 00000000 017a5200 017c0801  .........zR..|..
 80485b4 1b0c0404 88010000 20000000 1c000000  ........ .......
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值