64位系统结构体对齐访问段错误

先放代码:

#include 
   
   
    
    
struct s {
	char c;
	int b;
};

int main(void){
	printf("sizeof (struct s) = %d.\n",sizeof(struct s));
	struct s s1;
	s1.c = 'g';
	s1.b = 66;
	
	char *p1 = (char *)(int)(&s1);
	printf("*p1 = %c.\n", *p1);		// g
	int *p2 = (int *)((int)&s1 + 1);
	printf("*p2 = %d.\n", *p2);		// 乱码
	int *p3 = (int *)((int)&s1 + 4);
	printf("*p3 = %d.\n", *p3);		// 66
}

   
   

这是一个简单的结构体对齐的例子,笔者在unbuntu 64位下运行的时候却老是出现段错误:


在VS2015中测试:

x86状态(即32位环境):



X64环境:


运行出现了错误,笔者经过调试后发现,64位下&a指针类型为8字节,用int强制转化值只截取了4字节会导致错误,

linux下修改代码如下:

#include <stdio.h>
struct s {
char c;
int b;
};


int main(void){
printf("sizeof (struct s) = %ld.\n",sizeof(struct s));
struct s s1;
s1.c = 'g';
s1.b = 66;

char *p1 = (char *)(long)(&s1);
printf("*p1 = %c.\n", *p1);// g
int *p2 = (int *)((long)&s1 + 1);
printf("*p2 = %d.\n", *p2);// 乱码
int *p3 = (int *)((long)&s1 + 4);
printf("*p3 = %d.\n", *p3);// 66
}

结果:



要是在VS2015中x64运行需要将long改成long long型。




感悟:在32位和64位系统以及不同的编译环境下面的结构各不相同,在以后学习过程中要多多注意,下面笔者列出VS2015和linux下各种数据类型长度,以供参考~

数据类型32位VS2015(64位)Linux(64位)
short222
char111
int444
float444
long448
long long888
double888
void *488



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

种瓜大爷

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值