经典的Linux进程内存布局,如下图:
整个内存空间包括栈区,全局区,堆区。
void arr_on_stack() {
int arr[6];
arr[0]=100;
arr[1]=200;
arr[2]=300;
arr[3]=400;
arr[4]=500;
arr[5]=600;
int a = arr[0];
}
我们定义了一个局部变量arr作为int类型的数组,然后分别将100-600写到了数组中。那么,数组arr在内存中是怎样表示的呢?
首先,我们编译一下:
#gcc-g-fno-stack-protectora.c
注意,-fno-stack-protector选项是为了禁止堆栈保护,让汇编更容易懂些。使用gdb测试代码运行情况,gdb面前程序的运行时(run time)了无秘密。用gdb来调试刚刚编译出来的程序,这里看一下arr_on_stack函数的汇编指令:
(gdb) disassemble arr_on_stack
Dump of assembler code for function arr_on_stack:
0x0000000000400526 <+0>: push %rbp
0x0000000000400527 <+1>: mov %rsp,%rbp
0x000000000040052a <+4>: movl $0x64,-0x20(%rbp)
0x0000000000400531 <+11>: movl $0xc8,-0x1c(%rbp)
0x0000000000400538 <+18>: movl $0x12c,-0x18(%rbp)
0x000000000040053f <+25>: movl $0x190,-0x14(%rbp)
0x0000000000400546 <+32>: movl $0x1f4,-0x10(%rbp)
0x000000000040054d <+39>: movl $0x258,-0xc(%rbp)
=> 0x0000000000400554 <+46>: mov -0x20(%rbp),%eax
0x0000000000400557 <+49>: mov %eax,-0x4(%rbp)
0x000000000040055a <+52>: nop
0x000000000040055b <+53>: pop %rbp
0x000000000040055c <+54>: retq
End of assembler dump.
审核编辑:汤梓红
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
-
Linux
+关注
关注
87文章
10986浏览量
206712 -
内存
+关注
关注
8文章
2762浏览量
72742 -
C语言
+关注
关注
180文章
7527浏览量
128159
发布评论请先 登录
相关推荐
C语言中数组和结构体的内存表示和布局
C语言中,数组和结构体都可以代表一块内存,但为什么结构体可以直接赋值,而数组不可以?这个问题涉及到C语言的设计哲学、语法规则以及
发表于 08-28 10:54
•467次阅读
【每日一知识点】C语言中const详解
的内存地址,所以,const定义的只读变量在程序运行过程中只有一份备份,它是全局的只读变量,是存放在静态区的。2、 修饰数组C语言中const还可以修饰
发表于 03-29 10:53
单片机C语言中常用的基本数据类型分为哪几类
不管在什么语言中,定义一个变量时必然要在内存中开辟一个相应大小的空间来存储该变量。不同的数据类型在内存所占的空间大小不同,其所能表示的数据范围也不相同。在单片机C
发表于 02-28 06:46
C语言中的数组空间动态开辟
C语言中的数组空间动态开辟 在C语言中,必不可少的需要使用到数组,通常为了动态的开辟数组空间,可以使用 malloc 函数,在C++中可以使
C语言中什么是指针数组
在C语言中一个数组,若其元素均为指针类型数据,称为指针数组,也就是说,指针数组中的每一个元素都存放一个地址,相当于一个指针变量。
c语言中数组怎么定义
C语言中,数组是一种用来存储相同类型元素的数据结构。它可以存储多个元素,并通过一个共同的名称来引用这些元素。数组是一种很重要的数据结构,可以用于解决很多实际的问题。 在C语言中,定义
数组和链表在内存中的区别 数组和链表的优缺点
数组和链表在内存中的区别 数组和链表的优缺点 数组和链表是常见的数据结构,用于组织和存储数据。它们在内存中的存储方式以及优缺点方面
评论