最近群里有位同学问“C语言中数组在内存中是怎样表示的”,今天我们就来聊一聊这个话题。
开局一张图:
如上图所示,这是经典的Linux进程内存布局,通常我们使用的数据存在这样几个地方:
-
栈区,Stack
-
全局区,Global
-
堆区,Heap
接下来,我们分别看一下C语言中的数组在这几个区域是怎样表示的(注意:这里的机器是x86 64位)。
1、数组与栈区
先来看一段极其简单的代码:
我们定义了一个局部变量arr作为int类型的数组,然后分别将100-600写到了数组中。那么,数组arr在内存中是怎样表示的呢?
首先,我们编译一下:
注意,-fno-stack-protector选项是为了禁止堆栈保护,让汇编更容易懂些,关于堆栈保护这个话题可以参考这篇文章《黑客攻防:缓冲区溢出攻击与堆栈保护》。
好啦,一切准备就绪,可以庖丁解牛啦,使用的刀就是gdb,代码面前了无秘密,gdb面前程序的运行时(run time)了无秘密。
用gdb来调试刚刚编译出来的程序,这里看一下arr_on_stack函数的