#include <stdio.h> #include <stdlib.h> #include <string.h> int a = 0; // 全局初始化区 a所处地址0X00400000之后 char *p1; // 全局未初始化区 p1所处地址 0x00400000之后 int main() { int b; //栈 b所处址0x00100000之后 char s[] = "abc"; // 栈 s所处地址同上 char *p2; // 栈 p2所处地址同上 char *p3 = "123456"; // 123456\0在常量区,p3在栈上。 p3所处地址(&p3)0x00100000 而p3指向的串(p3)位于0x00400000上 static int c =0; // 全局(静态)初始化区 因为静态,所以c地址亦位于0x00400000之后 p1 = (char *)malloc(10); //由于p1定义于全局 因而p1处于0x00400000之后,但指向的空间位于0x00300000之后 p2 = (char *)malloc(20); //p2定义于局部 因而p2处于0x00100000之后,而指向的空间位于0x00300000//分配得来得10和20字节的区域就在堆区。 p1/p2指向的分配空间均处于0x00300000后,或许是堆空间,然而多次运行的值也是不变的? strcpy(p1, "123456"); // 123456\0放在常量区,编译器可能会将它与p3所指向的"123456"优化成一个地方。 printf("a 地址:%x p1 地址:%x p1指向的地址:%x b地址:%x s指向的地址:%x p2地址:%x p3 地址:%x p3指向的地址 :%x c地址:%x p1地址%x p1指向的地址%x p2地址 %x p2指向的地址 %x\n",&a,&p1,p1,&b,s,&p2,&p3,p3,&c,&p1,p1,&p2,p2); char kk[10]; scanf("%s",kk); return 0; }
G:\My documents\Visual Studio 2005\Projects\test\debug>test
a 地址:417164 p1 地址:417160 p1指向的地址:3a2910 b地址:12ff5c s指向的地址:12ff50
p2地址:12ff44 p3 地址:12ff38 p3指向的地址 :415800 c地址:417168 p1地址417160 p1指向的地址3a2910 p2地址 12ff44 p2指向的地址 3a2948
原创文章,作者:苏葳,如需转载,请注明出处:https://www.swmemo.com/213.html