#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 ........ .......