社区
C语言
帖子详情
静态数组堆栈中的内存地址对齐问题
fengxiaoke_fxk
2012-04-30 04:37:34
在实现静态int数组堆栈时,如果取得了内存中的这么一块内存,地址从2000到3000,那么数组中0~n-1个下标对应的元素是0对应2000~2004,1对2005~2008。。。这样依次下去呢还是0对应2997~3000,1对应2993~2996这样反着来?
那个先进后出是怎么回事?是说第一个输入的占0,第二个输入占1.。。。还是反着来?
...全文
197
7
打赏
收藏
静态数组堆栈中的内存地址对齐问题
在实现静态int数组堆栈时,如果取得了内存中的这么一块内存,地址从2000到3000,那么数组中0~n-1个下标对应的元素是0对应2000~2004,1对2005~2008。。。这样依次下去呢还是0对应2997~3000,1对应2993~2996这样反着来? 那个先进后出是怎么回事?是说第一个输入的占0,第二个输入占1.。。。还是反着来?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
7 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
fengxiaoke_fxk
2012-05-01
打赏
举报
回复
[Quote=引用 6 楼 的回复:]
(gdb) p &a
$1 = (int (*)[10]) 0xbfffefd0
(gdb) x/40b a
0xbfffefd0: 1 0 0 0 2 0 0 0
0xbfffefd8: 3 0 0 0 4 0 ……
[/Quote]
懂了,OK
jiligululalala
2012-04-30
打赏
举报
回复
(gdb) p &a
$1 = (int (*)[10]) 0xbfffefd0
(gdb) x/40b a
0xbfffefd0: 1 0 0 0 2 0 0 0
0xbfffefd8: 3 0 0 0 4 0 0 0
0xbfffefe0: 5 0 0 0 6 0 0 0
0xbfffefe8: 7 0 0 0 8 0 0 0
0xbfffeff0: 9 0 0 0 10 0 0 0
fengxiaoke_fxk
2012-04-30
打赏
举报
回复
[Quote=引用 3 楼 的回复:]
int a[10] = {1,2,3,4,5,6,7,8,9,10}
定义了一个数组,且10个元素都赋值了
(gdb) p &a
$2 = (int (*)[10]) 0xbfffefd0
p &a这条命令,打印出数组a的地址
(gdb) x/20 &a
0xbfffefd0: 0x00000001 0x00000002 0x00000003 0x0……
[/Quote]
我想问的是0和哪一个地址对齐,是0x00000001还是0x0000000a
夏天__
2012-04-30
打赏
举报
回复
楼上说的很正确.
解释的很到位、
jiligululalala
2012-04-30
打赏
举报
回复
int a[10] = {1,2,3,4,5,6,7,8,9,10}
定义了一个数组,且10个元素都赋值了
(gdb) p &a
$2 = (int (*)[10]) 0xbfffefd0
p &a这条命令,打印出数组a的地址
(gdb) x/20 &a
0xbfffefd0: 0x00000001 0x00000002 0x00000003 0x00000004
0xbfffefe0: 0x00000005 0x00000006 0x00000007 0x00000008
0xbfffeff0: 0x00000009 0x0000000a
x/20 &a 显示内存中数组a地址中的内容,也就是初始化的那些数字1~10
fengxiaoke_fxk
2012-04-30
打赏
举报
回复
[Quote=引用 1 楼 的回复:]
Temporary breakpoint 2, main () at arr.c:5
5 int a[10] = {1,2,3,4,5,6,7,8,9,10};
(gdb) s
7 return 0;
(gdb) p &a
$2 = (int (*)[10]) 0xbfffefd0
(gdb) x/20 &a
0……
[/Quote]
我还没开始学习gdb,你能不能加点注释,解释清楚一点
jiligululalala
2012-04-30
打赏
举报
回复
Temporary breakpoint 2, main () at arr.c:5
5 int a[10] = {1,2,3,4,5,6,7,8,9,10};
(gdb) s
7 return 0;
(gdb) p &a
$2 = (int (*)[10]) 0xbfffefd0
(gdb) x/20 &a
0xbfffefd0: 0x00000001 0x00000002 0x00000003 0x00000004
0xbfffefe0: 0x00000005 0x00000006 0x00000007 0x00000008
0xbfffeff0: 0x00000009 0x0000000a
计算机
中
的内存
对齐
以及内存的
堆栈
分配原理
在大多数低层程序设计
中
,由于内存分配与内存
对齐
问题
所带来的bug所占比重非常大。本文对内存分配
中
的分配空间类型、作用、方法、适用范围、优缺点以及内存
对齐
问题
中
的
对齐
原因、
对齐
规则等进行了详细的说明,并结合大量c语言代码进行阐述与分析。 [关键词] 内存分配;
堆栈
原理;内存
对齐
; 1 引言 操作系统的内存分配
问题
与内存
对齐
问题
对于低层程序设计来说是非常重要的,对内存
STM32 终极字节
对齐
解析
一、全局变量
对齐
问题
: 基本上用户定义的变量是几个字节就是几字节
对齐
,这个比较好理解。 uint8_t定义变量地址要1字节
对齐
。 uint16_t定义变量地址要2字节
对齐
。 uint32_t定义变量地址要4字节
对齐
。 uint64_t定义变量地址要8字节
对齐
。 指针变量是4字节
对齐
。 二、结构体成员
对齐
问题
: 首先明白一点,结构体里面的变量是什么类型,此变量的位置就是至少要几字节
对齐
,所以就存在结构体实际占用大小不是这些变量之和。 typedef struct { uint8_t...
数据结构
中
的
堆栈
和内存分配
中
的
堆栈
数据结构
中
的堆和栈 与 内存分配
中
的堆区和栈区 分析 转载自jzssuanfa大佬,主要用于自己记录学习 比較全面的总结了诸多版本号,知识无国界。感谢各位的辛勤劳作。 在计算机领域,
堆栈
是一个不容忽视的概念,我们编写的C/C++语言程序基本上都要用到。但对于非常多的初学着来说,
堆栈
是一个非常模糊的概念。 (1)数据结构的栈和堆 首先在数据结构上要知道
堆栈
,虽然我们这么称呼它,但实...
C语言字节
对齐
详解
现代计算机
中
,内存空间按照字节划分,理论上可以从任何起始地址访问任意类型的变量。但实际
中
在访问特定类型变量时经常在特定的
内存地址
访问,这就需要各种类型数据按照一定的规则在空间上排列,而不是顺序一个接一个地存放,这就是
对齐
。有些信息在存储时,并不需要占用一个完整的字节,而只需占几个或一个二进制位。例如在存放一个开关量时,只有0和1两种状态,用一位二进位即可。为了节省存储空间和处理简便,C语言提供了一种数据结构,称为“位域”或“位段”。
C/C++
中
的数据结构
对齐
,#pragma pack() 和 __attribute__
数据结构
对齐
是指在计算机内存
中
排列和访问数据的方式。它包含三个独立但相关的
问题
:**数据
对齐
**(data alignment),**数据结构填充**( data structure padding)和**打包**(packing)。当被访问的数据长度为n个字节,并且基准地址是n个字节
对齐
的时候,就可以说一个内存访问是
对齐
的。如果一个内存指针指的是n字节长的原始数据,并且只允许它包含n字节
对齐
的地址,那么这个指针就被称为
对齐
的。在栈
中
的
静态
尺寸被称为 有界(bounded),在堆
中
的动态尺寸被称为 无界
C语言
69,371
社区成员
243,080
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章