程序的机器级表示(四)

注:以下所有内容均来自开源学习组织DataWhale

程序的机器级表示(四)

1 结构体

对于C代码中的一个结构体:

struct rec{
    int i;
    int j;
    int a[2];
    int *p;
}

其对应内存中的位置如下:

在这里插入图片描述

可以看出数组的元素是嵌入到结构体中的。

1.1 数据对齐

对于结构体:

struct S1{
    int i;
    char c;
    int j;
}

其在内存中的占12个bytes,如下图示意:

在这里插入图片描述

i为int类型占4个bytes,c为char占1个byte,但编译器会在c的后面补上3个bytes,这是因为j为int类型,起始地址必须为4的倍数,因此需要在c后面补3个bytes。

对于不同的数据类型,地址对其的原则是任何K字节的基本对象的地址必须是K的倍数。例如short类型,起始地址必须是2的倍数。如下表所示:

KTypes
1char
2short
4int, float
8long, double, char*

当更改结构体内数据类型顺序时:

struct S1{
    int i;
    int j;
    char c;
}

其在内存中的分配如下:

在这里插入图片描述

可以看出在char类型后面又补充了3个字节的填充,这是因为只有这样当结构体以数组形式存在时才能满足首地址是结构体的字节数的倍数。

2 联合体

与结构体不同,联合体中的所有字段共享统一存储区域,因此联合体的大小取决于它最大字段的大小。与结构体对比如下:

在这里插入图片描述

变量v和数组i大小都是8个bytes,所以这个联合体占8个bytes。

联合体的一种情况是:如果两个不同字段的使用是互斥的,那么就可以将这两个字段声明为一个联合体。

3 缓冲区溢出

当一个函数使用的栈的内存存储空间超过了实际给这个函数分配的内存存储空间时,会发生缓冲区溢出。缓冲区溢出会导致栈中的信息被破坏。

许多计算机病毒就是通过缓冲区溢出的方式来攻击计算机的,目前又三种机制来防止这种攻击:

  • 栈随机化
  • 栈破坏检测
  • 限制可执行代码区域
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值