0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

浅谈C语言中数组在内存的存在形式

嵌入式应用开发 来源:嵌入式应用开发 作者:嵌入式应用开发 2022-09-28 14:50 次阅读

经典的Linux进程内存布局,如下图:

pYYBAGMz7YaACxISAAEprYrRtbU873.png

整个内存空间包括栈区,全局区,堆区。

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.
poYBAGMz7rCAOLCOAAF3C6ObOtM017.png
审核编辑:汤梓红
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Linux
    +关注

    关注

    87

    文章

    11219

    浏览量

    208872
  • 内存
    +关注

    关注

    8

    文章

    2996

    浏览量

    73867
  • C语言
    +关注

    关注

    180

    文章

    7597

    浏览量

    136117
收藏 人收藏

    评论

    相关推荐

    小数在内存中是如何存储的?为什么C语言中的浮点数不支持位移操作?

    小数在内存中是如何存储的?为什么C语言中的浮点数不支持位移操作?
    发表于 08-16 09:24 1005次阅读
    小数<b class='flag-5'>在内存</b>中是如何存储的?为什么<b class='flag-5'>C</b><b class='flag-5'>语言中</b>的浮点数不支持位移操作?

    C语言中数组和结构体的内存表示和布局

    C语言中数组和结构体都可以代表一块内存,但为什么结构体可以直接赋值,而数组不可以?这个问题涉及到C
    发表于 08-28 10:54 1448次阅读

    C语言中数组的用法

    C语言数组是一种数据结构,它可以存储多个相同类型的数据,例如整数,字符,浮点数等。数组的每个元素都有一个索引,用来表示它在数组中的位置。
    的头像 发表于 11-24 17:48 1239次阅读
    <b class='flag-5'>C</b><b class='flag-5'>语言中</b><b class='flag-5'>数组</b>的用法

    C语言中怎么判断数组元素的个数

    C语言中怎么判断数组元素的个数,如数组:int array[]={45,56,76,234,1,34,23,2,3};
    发表于 05-26 11:49

    如何使用单片机的C语言中数组

    如何使用单片机的C语言中数组
    发表于 10-15 08:59

    C语言中的char数组和char指针有什么区别?

    让我们通过下面的例子,来了解 C语言中字符数组和字符指针之间的区别。
    的头像 发表于 01-29 16:35 2628次阅读

    C语言中数组空间动态开辟

    C语言中数组空间动态开辟 在C语言中,必不可少的需要使用到数组,通常为了动态的开辟
    的头像 发表于 02-10 12:42 2070次阅读

    C语言中数组在内存中如何表示

    C语言中数组在内存中是怎样表示的,今天就给大家聊聊这个话题。
    的头像 发表于 02-15 14:35 894次阅读
    <b class='flag-5'>C</b><b class='flag-5'>语言中</b><b class='flag-5'>数组</b><b class='flag-5'>在内存</b>中如何表示

    C语言中什么是指针数组

    C语言中一个数组,若其元素均为指针类型数据,称为指针数组,也就是说,指针数组中的每一个元素都存放一个地址,相当于一个指针变量。
    的头像 发表于 03-10 15:26 1661次阅读

    C语言怎么建立内存的动态分配

    C语言中,全局变量是分配在内存中的静态存储区的,非静态的局部变量,包括形参是分配在内存中的动态存储区的,这个存储区是一个“栈”的区域。
    的头像 发表于 03-10 15:30 824次阅读

    c语言数组中查找指定元素

    C语言是一种通用的编程语言,广泛应用于各种领域,包括嵌入式系统、操作系统、游戏开发等。在C语言中数组
    的头像 发表于 11-24 10:07 3791次阅读

    C语言如何创建数组

    C语言是一种非常强大和灵活的编程语言,它提供了若干数据类型来存储和操作数据。其中之一就是数组,它可以用来存储一系列具有相同数据类型的元素。本文将详细介绍如何在
    的头像 发表于 11-24 10:08 1726次阅读

    c语言中数组怎么定义

    C语言中数组是一种用来存储相同类型元素的数据结构。它可以存储多个元素,并通过一个共同的名称来引用这些元素。数组是一种很重要的数据结构,可以用于解决很多实际的问题。 在
    的头像 发表于 11-24 10:11 2899次阅读

    c语言中多维数组可以嵌套定义

    C语言中多维数组可以嵌套定义,这使得我们可以在一个数组中存储另一个数组。通过这种方式,我们可以创建更加复杂和灵活的数据结构,以便更好地表示和
    的头像 发表于 11-24 10:18 1079次阅读

    数组和链表在内存中的区别 数组和链表的优缺点

    数组和链表在内存中的区别 数组和链表的优缺点  数组和链表是常见的数据结构,用于组织和存储数据。它们在内存中的存储方式以及优缺点方面
    的头像 发表于 02-21 11:30 890次阅读