C语言中的sizeof

转载 2015年07月11日 10:45:44
在CU的C/C++版看到一个例子:http://bbs.chinaunix.net/thread-3621056-1-1.html
#include <stdio.h>

struct A{
        char a;
        char b;
        int c[0];
};

struct B{
        char a;
        char b;
        int c;
};

int main()
{         printf("sizeof(struct A): %d\n", sizeof(struct A));         printf("sizeof(struct B): %d\n", sizeof(struct B));

        return 0;
}
结果:
  1. digdeep@ubuntu:~/uulp$ gcc -Wall -o sizeof sizeof.c
  2. digdeep@ubuntu:~/uulp$ ./sizeof
  3. sizeof(struct A): 4
  4. sizeof(struct B): 8
  5. digdeep@ubuntu:~/uulp$
C语言在编译时的对齐规则:
1)找出struct 结果体中占用内存最大的类型(__alignof__(type)最大的类型),在struct A,struct B中都是int。
2)知道常识:编译指标器(#pragma pack(X),x86机器上默认X一般是4。
3)机器字长 (32位/64位)
注:有个容易误解的地方,占用内存最大的类型,不是指sizeof最大的那个,而是指__alignof__(type)最大的那个,double在32位上,可以为4和8,默认为4,可由编译参数控制,如果编译时加上-malign-double__aignof__(double)值由4变成了8。(一般除了double之外,其它的类型sizeof(type)  == __alignof__(type) )

比较三者,按照三者中
的来对齐。
因为__alignof__(int) == sizeof(int) == 4,所以struct A和struct B都是按照4字节对齐。
所以:sizeof(struct A) == 4, sizeof(struct B) == 8
在struct A中应该说int c[0]并不占用内存。也就是0长度的数组不占内存。
但是:数组长度虽然为0,但是却影响了结构体整体的对齐

一个类型的对齐值,可通过操作符__alignof__(type)得到
struct A{
      char a;
      char b;
      int a[0];
};
在编译器默认对齐方式的情况下,结构体内成员所在位置必须为其自身类型的整数倍,即short型必须在__aignof__(short) * n == 2n 的位置上开始存储。int 型必须在__aignof__(int)*n == 4n,double型必须在__aignof__(double)*n ==4n != 8n的位置上开始存储。而对于0长数组的情况,这个数组只是看上去在结构体里面,实际上并不能算是结构体的正式成员。
但是我们使用他的时候需要把他当做结构体的成员使用。

结构体 struct A 当中,由于最后一个成员是int c[0], 在为结构体分配空间时,按照int 类型对齐
假设 A.a地址为0xbfd1c, 则A.b地址为0xbfd1d, 则数组c的起始地址为0xbfd1d往后2位(按照int类型对齐),即为0xbfd20,但是c[0]不分配空间不占空间所以sizeof(A)=4
示例:
  1. #include <stdio.h>

  2. struct A{
  3.         char a;
  4.         char b;
  5.         double d;
  6. };

  7. int main()
  8. {
  9.         printf("sizeof(struct A): %d\n", sizeof(struct A));
  10.         return 0;
  11. }
编译运行结果:
digdeep@ubuntu:~/uulp$ gcc -Wall -o sizeof sizeof.c
digdeep@ubuntu:~/uulp$ ./sizeof
sizeof(struct A): 12
digdeep@ubuntu:~/uulp$ gcc -Wall -malign-double -o sizeof sizeof.c
digdeep@ubuntu:~/uulp$ ./sizeof
sizeof(struct A): 16
digdeep@ubuntu:~/uulp$
可以看出,加了 -malign-double 选项时,结果为16,没有加 -malign-double 选项时,结果为12.
加了 -malign-double 选项时,强调按照double的sizeof(double)的大小来对齐。


在看一看几个例子:
#include <stdio.h>

struct A{
        char a;
        char b;
};

struct B{
        char a;
        char b;
        double c;
};

struct C{
        char a;
};

struct D{
        char a;
        short c[0];
};

struct E{
        char a;
        int c[0];
};

int main()
{
        printf("sizeof(struct A): %d\n", sizeof(struct A));
        printf("sizeof(struct B): %d\n", sizeof(struct B));
        printf("sizeof(struct C): %d\n", sizeof(struct C));
        printf("sizeof(struct D): %d\n", sizeof(struct D));
        printf("sizeof(struct E): %d\n", sizeof(struct E));

        return 0;
}
结果:
  1. digdeep@ubuntu:~/uulp$ gcc -Wall -o sizeof2 sizeof2.c
  2. digdeep@ubuntu:~/uulp$ ./sizeof2
  3. sizeof(struct A): 2
  4. sizeof(struct B): 12
  5. sizeof(struct C): 1
  6. sizeof(struct D): 2
  7. sizeof(struct E): 4

http://bbs.chinaunix.net/thread-3636905-1-3.html看到另一个与sizeof相关的问题:

2.某32位系统下, C++程序,请计算sizeof 的值(5分).
char str[] = “http://www.ibegroup.com/
char *p = str ;
int n = 10;
请计算
sizeof (str ) = ?(1)
sizeof ( p ) = ?(2)
sizeof ( n ) = ?(3)
void Foo ( char str[100]){
请计算
sizeof( str ) = ?(4)
}
void *p = malloc( 100 );
请计算
sizeof ( p ) = ?(5)

答:(1)25 (2)4 (3) 4 (4)4 (5)4
此题的关键是看:sizeof() 计算的到底是什么类型的变量的大小!!!
第一个sizeof(str),很明显str是将一个字符赋值给一个字符数组,所以答案应该是数组的大小。是25而不是24,因为最后还有结尾符:‘/0‘
第二个sizeof(p),很明显p是一个指针,所以在32为机器上大小为4字节
第三个sizeof(n),很简单,32为机器上int为4字节
第四个sizeof(str),应该注意该"str"是一个参数,我们知道C中数组作为参数,实际上传递的是数组的第一个元素的地址,所以"str"是一个指针,所以sizeof(str)等于4
第五个sizeof(p),p也是指针,所以大小为4.

这里特别要注意的是第一个和第四个!
第一个等于25而不是24要特别注意,因为是将一个字符串赋值给字符数组,而字符串是有结尾符的!!!
看下面代码的运行结果:
  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. void foo(char str[100])
  4. {
  5.         printf("sizeof(str3): %d\n", sizeof(str));
  6. }

  7. int main()
  8. {
  9.         char str[] = "http://www.ibegroup.com/";
  10.         char str2[] = {'h', 't', 't','p',':','/','/',
  11.                         'w','w','w','.','i','b','e','g','r','o','u','p',
  12.                         '.','c','o','m','/'};
  13.         char *= str ;
  14.         int n = 10;
  15.         void *p1 = malloc(100);

  16.         printf("sizeof(str): %d\n", sizeof(str));
  17.         printf("sizeof(str2): %d\n", sizeof(str2));
  18.         printf("sizeof(p): %d\n", sizeof(p));
  19.         printf("sizeof(n): %d\n", sizeof(n));
  20.         printf("sizeof(p1): %d\n", sizeof(p1));
  21.         foo(str);

  22.         return 0;
  23. }
运行结果:
  1. digdeep@ubuntu:~/uulp$ ./sizeof
  2. sizeof(str): 25
  3. sizeof(str2): 24
  4. sizeof(p): 4
  5. sizeof(n): 4
  6. sizeof(p1): 4
  7. sizeof(str3): 4

C语言中sizeof的用法

今天同学问我sizeof可不可以计算结构体的大小,我竟然忘了C语言还有sizeof这个函数,我是多久没有写程序了啊!!!惭愧,上研究生后写嵌入式方面的程序就特别少了,看来以后还要经常来练练手才行。现在...
  • xiong57785
  • xiong57785
  • 2015年03月06日 19:24
  • 1070

C语言中的sizeof用法

C语言中的sizeof是一个很有意思的关键字,经常有人用不对,搞不清不是什么。我以前也有用错的时候,现在写一写,也算是提醒一下自己吧。反正现在来看,还在搞sizeof是什么意思,怎么用正确,还是有点搞...
  • Code_My_Life
  • Code_My_Life
  • 2015年07月31日 17:12
  • 7857

C语言中,sizeof运算符的作用

通常用来计算一个变量或者类型的大小的,单位是字节 譬如sizeof(char)==1, sizeof(int *)==4 这些是计算的类型的大小,char是一个字节,int*是4个字节(其实32位系统...
  • MySafe_Steven
  • MySafe_Steven
  • 2016年08月08日 11:46
  • 886

C语言中的strlen与sizeof的区别

sizeof与strlen是有着本质的区别,sizeof是求数据类型所占的空间大小,而strlen是求字符串的长度,字符串以/0结尾。区别如下: (1) sizeof是一个C语言中的一个单目运算...
  • Yelbosh
  • Yelbosh
  • 2013年10月12日 19:04
  • 3521

C语言中简单的sizeof()函数

#include #include void fun(int b[]){ printf("%i\n",sizeof(b));//4 } void fun1(char b[]){ printf...
  • skill_manchen
  • skill_manchen
  • 2016年09月18日 23:54
  • 1023

黑马程序员------C语言中sizeof运算符的使用

sizeof运算符是一个单目运算符      作用是:计算常量、变量、数据类型 在内存中占用的字节数      1)用sizeof计算常量在内存中占用的字节数         sizeof(1) 计算...
  • u012161322
  • u012161322
  • 2015年07月15日 15:56
  • 548

C语言中sizeof和strlen的区别与联系

C语言中sizeof和strlen的区别与联系         在学习C语言的时候发现经常将sizeof和strlen弄混淆,今天有遇到这个问题,所以查了一些资料,将他们总结在下面,虽然不是很全,但已...
  • zhanghao864442969
  • zhanghao864442969
  • 2015年09月08日 23:39
  • 598

c语言详解sizeof & sizeof函数总结

一、sizeof的概念   sizeof是C语言的一种单目操作符,如C语言的其他操作符++、--等。 它并不是函数。 sizeof操作符以字节形式给出了其操作数的存储大小。 操作数可以是一...
  • gws1229
  • gws1229
  • 2012年09月24日 21:20
  • 703

C语言中的sizeof(struct )和sizeof(union)

一般32位机上各数据类型所占存储空间为: char : 8位 short : 16位 int : 32位 long : 32位 float : 32位 double : 64位 一、结构体stru...
  • yagnruinihao
  • yagnruinihao
  • 2013年11月06日 21:19
  • 1923

C语言中各种数据类型的长度 sizeof char, short, int, long, long long

sizeof char, short, int, long, long long
  • ssmale
  • ssmale
  • 2013年07月13日 19:02
  • 4304
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C语言中的sizeof
举报原因:
原因补充:

(最多只允许输入30个字)