c语言变量在内存哪个区域,C语言修饰变量的关键字,及存放的内存区域

测试代码:test_men.c

1

#include

2

#include

3

4 int i1;

//BBS段

5 int i2 = 2; //

全局区

6 const int i3 = 3;

// 只读常量区

7 static int i4 =

4;  // 全局区

8 static int i5 ;

// BBS段

9 int main ()

{

10

int i6;  //

栈区

11

static int i7;

// BBS

12

static int i8 = 8;

//全局区

13

const int i9 = 9;

// 栈区

14

int* p =(int*)

malloc(sizeof(int));  // 指向堆区,自身地址在栈区

15

char* s1 = "abcd12";

//指向只读常量区,自身地址在栈区

16

char s2[] = "abcd123";

//栈区存放数据

17

// 打印各变量值和地址

18

printf("i1=%d, %p\n", i1,

&i1);

19

printf("i2=%d, %p\n", i2,

&i2);

20

printf("i3=%d, %p\n", i3,

&i3);

21

printf("i4=%d, %p\n", i4,

&i4);

22

printf("i5=%d, %p\n", i5,

&i5);

23

printf("i6=%d, %p\n", i6,

&i6);

24

printf("i7=%d, %p\n", i7,

&i7);

25

printf("i8=%d, %p\n", i8,

&i8);

26

printf("i9=%d, %p\n", i9,

&i9);

27

28

printf("p: %p\n",

p);

29

printf("s1=%s, s1:%p,

abcd12:%p\n", s1, &s1, s1);

30

printf("s2=%s, s2: %p,

abcd123:%p\n", s2, &s2, s2);

31

32

printf("pid=%d\n",

getpid());

33

//while(1);

34

return 0;

35 }

测试结果:

i1=0, 0x804a03c

i2=2, 0x804a020

i3=3, 0x8048750

i4=4, 0x804a024

i5=0, 0x804a034

i6=-1218297434, 0xbfa2cf94

i7=0, 0x804a038

i8=8, 0x804a028

i9=9, 0xbfa2cf98

p: 0x9155008

s1=abcd12, s1:0xbfa2cf9c,

abcd12:0x8048754

s2=abcd123, s2: 0xbfa2cfa4,

abcd123:0xbfa2cfa4

pid=2973

对比各变量地址,可以区分不同区域。

i3=3,

0x8048750

abcd12: 0x8048754

// 只读常量区,加了const

的全局变量(i3)和字符串字面值“abcd12”被存到只读常量区。

i2=2,

0x804a020

i4=4,

0x804a024

i8=8,

0x804a028  //全局区,初始化的全局变量(i2)和初始化的static变量(i4,

i8)。

i1=0,

0x804a03c

i5=0,

0x804a034

i7=0, 0x804a038  //BBS段,存储未初始化的全局变量和未初始化的static变量,并自动置零。所以i1, i5,

i7 被  置零了。从地址上来看,BBS段紧接在全局区后面。

p->0x9155008  //堆区,

从地址来看,离前面的数据有点远,可能从安全的角度来考虑,防范程序员操作失误

影响前面的数据。

i6=-1218297434,

0xbfa2cf94

i9=9,

0xbfa2cf98

s1:

0xbfa2cf9c

s2: 0xbfa2cfa4  //栈区:定义的局部变量都在这里

所以,进程的内存区域排序如下:(升序)

代码区

只读常量区

全局区

BSS段

堆区

栈区-在3G左右的位置

查看进程(pid)文件地址  cat

/proc/pid(用得到的pid号码替代)/maps

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值