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

#include "stdio.h"
#include "string.h"
#include "stdlib.h"
int main()
{
short int sa=;
int a=;
long la=;
float f = ;
double d=;
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。

  

C语言中sizeof的用法的更多相关文章

  1. C语言中sizeof()的用法

    语法 sizeof有三种语法形式: 1.sizeof(object); //sizeof(对象); 2.sizeof(type_name); //sizeof(类型); 3.sizeof object ...

  2. C语言中qsort函数用法

    C语言中qsort函数用法-示例分析    本文实例汇总介绍了C语言中qsort函数用法,包括针对各种数据类型参数的排序,非常具有实用价值非常具有实用价值. 分享给大家供大家参考.C语言中的qsort ...

  3. 对C语言中sizeof细节的三点分析

    转自对C语言中sizeof细节的三点分析 1.sizeof是运算符,跟加减乘除的性质其实是一样的,在编译的时候进行执行,而不是在运行时才执行. 那么如果编程中验证这一点呢?ps:这是前两天朋友淘宝面试 ...

  4. C语言中 malloc函数用法

    一.malloc()和free()的基本概念以及基本用法: 1.函数原型及说明: void *malloc(long NumBytes):该函数分配了NumBytes个字节,并返回了指向这块内存的指针 ...

  5. C/C++语言中const的用法

    1. const 在C和C++中的区别     C++中的const正常情况下是看成编译期的常量,编译器并不为const分配空间,只是在编译的时候将期值保存在名字表中,并在适当的时候折合在代码中. 所 ...

  6. 在不同语言中static的用法

    static (计算机高级语言) 编辑 像在VB,C#,C,C++,Java,PHP中我们可以看到static作为关键字和函数出现,在其他的高级计算机语言如FORTRAN.ALGOL.COBOL.BA ...

  7. 浅析C语言中assert的用法(转)

    原文地址:http://www.jb51.net/article/39685.htm 以下是对C语言中assert的使用方法进行了介绍,需要的朋友可以参考下. assert宏的原型定义在<ass ...

  8. C语言中extern的用法--转

    http://blog.sina.com.cn/s/blog_52deb9d50100ml6y.html 在C语言中,修饰符extern用在变量或者函数的声明前,用来说明“此变量/函数是在别处定义的, ...

  9. C语言中#define的用法(转)

    转自:http://www.dingge.com/main/article.asp?id=10 今天整理了一些#define的用法,与大家共享! 1.简单的define定义 #define MAXTI ...

随机推荐

  1. day3字符串操作作业详解

    1.day3题目 1.有变量name = "aleX leNb" 完成如下操作: 1) 移除 name 变量对应的值两边的空格,并输出处理结果 2) 移除name变量左边的&quo ...

  2. Codeforces 183A(坐标系性质)

    自从开始写上古场以后我就不断地写A.B题的题解了??? cf problem183A 无论每轮有哪几种选择,最后的可能结果放在一起一定是个钻石型,最后答案就是长方形长乘宽. 非常神奇的性质,如果走了e ...

  3. net core mvc剖析:启动流程

    net core mvc剖析:启动流程 asp.net core mvc是微软开源的跨平台的mvc框架,首先它跟原有的MVC相比,最大的不同就是跨平台,然后又增加了一些非常实用的新功能,比如taghe ...

  4. D. Restructuring Company 并查集 + 维护一个区间技巧

    http://codeforces.com/contest/566/problem/D D. Restructuring Company time limit per test 2 seconds m ...

  5. Ubuntu 18.04 Python3.6.6导入wx模块报Gtk-Message : 17:06:05.797 :Failed to load module "canberra-gtk-module"

    解决办法: root@sishen:~# apt-get install libcanberra-gtk-module

  6. MapReduce错误之Error: java.lang.RuntimeException: java.lang.NoSuchMethodException的解决方法

    今天跑MapReduce项目的时候遇到了这个问题,日志如下所示: // :: DEBUG ipc.ProtobufRpcEngine: Call: getDiagnostics took 19ms E ...

  7. 在前端解決顯示null值一例

    用.net core2.1 api返回的JSON里包含null值,前端直接顯示出來了,影響閱讀, 用以下語句將null轉換為空字符串: // Build html. html += "< ...

  8. 常用API(正则表达式、Date、DateFormat、Calendar)

    常用API 今日内容介绍 u 正则表达式 u Date u DateFormat u Calendar 第1章 正则表达式 1.1 正则表达式的概念 正则表达式(英语:Regular Expressi ...

  9. $.ajax同步/异步(async:false/true)

    虽然说ajax用来执行异步请求的比较多,但有时还是存在需要同步执行的情况的. 比如:我需要通过ajax取执行请求以返回一个值,这个值在ajax后面是需要使用到的,这时就不能用异步请求了.这时候就需要使 ...

  10. 多线程-Thread-Runnable

    一.多线程     1.基本概念         进程:正在运行中的程序,一个进程中至少包含一个线程         线程:进程的任务,执行任务的一个通道,一个进程中可以包含多个线程     2.多线 ...