sizeof - 指针,数组,变量,结构体字节对齐-计算
2014-02-17 15:28
344 查看
例子:
[root@localhost ccy]# ./a.out
4
11
100
400
4
3
4
6
8
4
4
32位:
long - 4字节
short - 2字节
指针 - 4字节
定长数组 int a[100] - 长度*类型 - 100*4字节
不定长数组 char a[]="123" - 3+"\0" = 4字节
B结构体 - 8字节
因为a1为long为4字节,所有这个B结构体以4字节方式对齐,即a2为short 2字节,但B结构体总长度为8字节;
例如:
struct
{
int a1;
char a2;
}C;//8字节
struct
{
int a1;
char a2;
char a3;
}C;//8字节
struct
{
int a1;
char a2;
char a3;
char a4;
char a5;
char a6;
}C;//12字节
再经典一点:
struct
{
int a1;
char a2;
char a3;
char a4;
char a5;
}C1;//8字节
struct
{
char a2;
int a1;
char a3;
char a4;
char a5;
}C2;//12字节
一、C1结构体-8字节
|---------------int--------------|
|-char-|-char-|-char-|-char-|
二、C2结构体-12字节
|-char-|-------|-------|-------|
|---------------int--------------|
|-char-|-char-|-char-|-------|
最近有看到更经典的例子:
struct
{
int a1;
short a2;
char a3[2];
}C;
|---------------int--------------|
|------short-----|-char-|-char-|
struct
{
short a1;
int a2;
char a3[2];
}D;
|------short-----|--------------|
|---------------int--------------|
|-char-|-char-|--------|--------|
#include <stdio.h> struct { short a1; short a2; short a3; }A; struct { long a1; short a2; }B; int main() { char * ss1="0123456789"; char ss2[]="0123456789"; char ss3[100]="0123456789"; int ss4[100]; char q1[]="abc"; char q2[]="a\n"; char * q3="a\n"; char *str1=(char *)malloc(100); void *str2=(void *)malloc(100); printf("%d\n",sizeof(ss1)); printf("%d\n",sizeof(ss2)); printf("%d\n",sizeof(ss3)); printf("%d\n",sizeof(ss4)); printf("%d\n",sizeof(q1)); printf("%d\n",sizeof(q2)); printf("%d\n",sizeof(q3)); printf("%d\n",sizeof(A)); printf("%d\n",sizeof(B)); printf("%d\n",sizeof(str1)); printf("%d\n",sizeof(str2)); return 0; }
[root@localhost ccy]# ./a.out
4
11
100
400
4
3
4
6
8
4
4
32位:
long - 4字节
short - 2字节
指针 - 4字节
定长数组 int a[100] - 长度*类型 - 100*4字节
不定长数组 char a[]="123" - 3+"\0" = 4字节
B结构体 - 8字节
因为a1为long为4字节,所有这个B结构体以4字节方式对齐,即a2为short 2字节,但B结构体总长度为8字节;
例如:
struct
{
int a1;
char a2;
}C;//8字节
struct
{
int a1;
char a2;
char a3;
}C;//8字节
struct
{
int a1;
char a2;
char a3;
char a4;
char a5;
char a6;
}C;//12字节
再经典一点:
struct
{
int a1;
char a2;
char a3;
char a4;
char a5;
}C1;//8字节
struct
{
char a2;
int a1;
char a3;
char a4;
char a5;
}C2;//12字节
一、C1结构体-8字节
|---------------int--------------|
|-char-|-char-|-char-|-char-|
二、C2结构体-12字节
|-char-|-------|-------|-------|
|---------------int--------------|
|-char-|-char-|-char-|-------|
最近有看到更经典的例子:
struct
{
int a1;
short a2;
char a3[2];
}C;
|---------------int--------------|
|------short-----|-char-|-char-|
struct
{
short a1;
int a2;
char a3[2];
}D;
|------short-----|--------------|
|---------------int--------------|
|-char-|-char-|--------|--------|
相关文章推荐
- 内存的字节对齐及结构体的sizeof计算
- 全面总结sizeof(字节对齐、数组、类(继承、虚函数)、结构体、strlen)*最全面*
- 计算结构体、数组、指针的sizeof
- 内存的字节对齐及结构体的sizeof计算
- 实例代码(栈地址增长方向、vtable对类size的影响、对象最小size概念、结构体对齐规则(对齐参数)、sizeof(指针),free与delete的区别)
- 结构体的内存对齐方式(结构体大小计算 sizeof)(
- [ZZ]关于结构体成员变量的字节对齐的分析
- 一维数组、二维数组、字符数组、指针 相关的 sizeof 计算
- 定义一个结构体变量(包括年、月、日),编写程序,要求输入年月日,程序能够计算并输出改日是本年中的第几天。注意闰年问题。(数组)
- 三十五、单例模式的改进、实现sizeof计算变量和类型大小,align计算对齐数
- 字节对齐--对sizeof计算产生影响
- 结构体变量、结构指针变量、结构数组作为函数的参数应用实例分析
- sizeof 计算指针和数组
- 结构体的sizeof字节对齐问题
- 内存字节对齐---对结构体非常重要。不能用memcpy简单的移动指针进行赋值
- 【C++】继承类之sizeof计算_字节对齐【总结篇】
- 编程题:指针变量指向结构体数组。
- sizeof 与结构体大小及结构体对齐问题, 字节对齐
- 结构体对齐导致结构体数组大小变化引发的指针越界操作问题.
- sizeof() 计算字符型指针数组元素个数时要注意