1. 苏葳的备忘录首页
  2. 编程

C控制台程序变量地址测试结果

c语言 变量 地址一个程序中的各个变量常量存放在什么位置,一般来说并不需要关注,这是由系统自动管理的。但是如果要对进程进行内存分析,内存修改的话,就很有必要研究一下进程的数据在内存中如何存放。比如C程序中有局部变量和全局变量之分,两者存放位置有何不同?常量的存放与变量有何不同?下面是一个小例子来打印各种变量的存放位置。

#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

发表评论

邮箱地址不会被公开。 必填项已用*标注