C语言中sizeof的用法

来源:互联网 发布:最早的陶器知乎 编辑:程序博客网 时间:2024/05/21 10:39

        今天同学问我sizeof可不可以计算结构体的大小,我竟然忘了C语言还有sizeof这个函数,我是多久没有写程序了啊!!!惭愧,上研究生后写嵌入式方面的程序就特别少了,看来以后还要经常来练练手才行。现在转载一篇看到的sizeof用法的文章,与大家分享(第一篇技术类的文章竟然是转载的,惭愧哭)。

        

     sizeof 一般形式为:sizeof(object),也可以sizeof var_char,不过大部分programer习惯用sizeof()。
     对象可以是表达式或者数据类型名,当对象是表达式时,括号可省略。sizeof是单目运算符,其运算符的含义是:求出对象在计算机内存中所占用的字节数。一般来讲,不同的机器,运行不同的对象是不一样的,当目前几乎所有的机器都是32位,很少16位的,所以一般考试都是基于32位的window和linux的。
    C语言中数据类型不多。
1.整数型的:
    如下:
#include "stdio.h"#include "string.h"#include "stdlib.h"int main(){    short int sa=10;    int a=10;    long la=10;    float f = 20;    double d=20;    char ch='c';    char str[]="ABC";    char *p=str;    struct str   {          double d;          char ch;          int data;    }str_wu;    struct str1{          char ch;          double d;          int data;    }str_wu1;    printf("sizeof(short):%d\n",sizeof(sa));    printf("sizeof(int):%d\n",sizeof(a));    printf("sizeof(long):%d\n",sizeof(la));    printf("sizeof(float):%d\n",sizeof(f));    printf("sizeof(double):%d\n",sizeof(d));    printf("sizeof(char):%d\n",sizeof(ch));    printf("sizeof(string):%d\n",sizeof(str));    printf("sizeof(point address):%d\n",sizeof(p));    printf("sizeof(Point):%d\n",sizeof(*p));    printf("sizeof(Struct):%d\n",sizeof(str_wu));    printf("sizeof(Struct):%d\n",sizeof(str_wu1));    system("pause");}
运行结果如下:
2.浮点型数据
    float,double,long double上边的图。
3。指针
    对于指针,要特别区分,指针指向什么数据,它在内存占的字节数才是它的结果。比如:指针指向一个字符串,就是字符串的长度,因为一个字符在内存中占一个字节。若指针指向一个数据结构,则结果应该是结构型数据的内存字节数。
4。结构类型
    在上面的程序中,
struct str
{
       double d;
       char ch;
       int data;
 }str_wu;
 struct str1
{
       char ch;
       double d;
       int data;
 }str_wu1;

两个不同的结构,但是内部的元素是相同的,都是double,int,char,只是顺序不一样,就结果不一样。why?
这时因为VC存储数据的时候要对其,具体的情况如下:
类型
  对齐方式(变量存放的起始地址相对于结构的起始地址的偏移量)
  Char
  偏移量必须为sizeof(char)即1的倍数
  int 
  偏移量必须为sizeof(int)即4的倍数
  float
  偏移量必须为sizeof(float)即4的倍数
  double
  偏移量必须为sizeof(double)即8的倍数
  Short
  偏移量必须为sizeof(short)即2的倍数
   比如:str_wu,为上面的结构分配空间的时候,VC根据成员变量出现的顺序和对齐方式,先为第一个成员d(类型double)分配空间,其起始地址跟结构的起始地址相同(刚好偏移量0刚好为sizeof(double)的倍数),该成员变量占用sizeof(double)=8个字节;接下来为第二个成员ch(类型char)分配空间,这时下一个可以分配的地址对于结构的起始地址的偏移量为8,是sizeof(char)的倍数,所以把dda存放在偏移量为8的地方满足对齐方式,该成员变量占用sizeof(char)=1个字节;接下来为第三个成员data(类型int)分配空间,这时下一个可以分配的地址对于结构的起始地址的偏移量为9,不是sizeof(int)=4的倍数,为了满足对齐方式对偏移量的约束问题,VC自动填充3个字节(这三个字节没有放什么东西),这时下一个可以分配的地址对于结构的起始地址的偏移量为12,刚好是sizeof(int)=4的倍数,所以把data存放在偏移量为12的地方,该成员变量占用sizeof(int)=4个字节;这时整个结构的成员变量已经都分配了空间,总的占用的空间大小为:8+1+3+4=16,刚好为结构的字节边界数(即结构中占用最大空间的类型所占用的字节数sizeof(double)=8)的倍数,所以没有空缺的字节需要填充)。所以整个结构的大小为:sizeof(str_wu)=8+1+3+4=16,其中有3个字节是VC自动填充的,没有放任何有意义的东西。
   而str_wu1,同样的道理:如下:sizeof(char)=1,而1不是8的倍数,因而增加到8,sizeof(double)=8,现在开始地址是16,16是sizeof(int)的倍数,可以存入。因而总的地址数:sizeof(char)+7+sizeof(double)+sizeof(int)=20,而20不是8的倍数(sizeof(double)=8),所以需要在增加4个地址,即总共24。

0 0
原创粉丝点击