先放代码:
#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位) |
---|---|---|---|
short | 2 | 2 | 2 |
char | 1 | 1 | 1 |
int | 4 | 4 | 4 |
float | 4 | 4 | 4 |
long | 4 | 4 | 8 |
long long | 8 | 8 | 8 |
double | 8 | 8 | 8 |
void * | 4 | 8 | 8 |