博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C中的sizeof
阅读量:6790 次
发布时间:2019-06-26

本文共 2687 字,大约阅读时间需要 8 分钟。

sizeof 一般形式为:
sizeof(object),也可以
sizeof var_char,不过大部分programer习惯用
sizeof()
     对象可以是表达式或者数据类型名,当对象是表达式时,括号可省略。sizeof是单目运算符,其运算符的含义是:求出对象在计算机内存中所占用的字节数。 一般来讲,不同的机器,运行不同的对象是不一样的,当目前几乎所有的机器都是32位,很少16位的,所以一般考试都是基于32位的window和 linux的。
C语言中数据类型不多。
 
1.整数型的:
 
short,int,long(我没有考虑符号问题),一般c语言书上讲,
int是2个字节的,即16位,范围是 -32768-32767,
long是4个字节,范围是-2^32---2^32-1。当时在xp上运行
sizeof(int)的时候,会output 4.这就是32位的原因。
sizeof(long)也是4.
如下:
#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");
}
 
因而int,
short
sizeof结果是一样的。
 
2.浮点型数据
 
float,double,long double
上边的图,long double 没有测试(忘了。。。。。)呵呵!
但是应该是16。
 
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根据成员变量出现的顺序和对齐方式,先为 第一个成员dda1分配空间,其起始地址跟结构的起始地址相同(刚好偏移量0刚好为sizeof(double)的倍数),该成员变量占用 sizeof(double)=8个字节;接下来为第二个成员dda分配空间,这时下一个可以分配的地址对于结构的起始地址的偏移量为8,是 sizeof(char)的倍数,所以把dda存放在偏移量为8的地方满足对齐方式,该成员变量占用sizeof(char)=1个字节;接下来为第三个 成员type分配空间,这时下一个可以分配的地址对于结构的起始地址的偏移量为9,不是sizeof(int)=4的倍数,为了满足对齐方式对偏移量的约 束问题,VC自动填充3个字节(这三个字节没有放什么东西),这时下一个可以分配的地址对于结构的起始地址的偏移量为12,刚好是 sizeof(int)=4的倍数,所以把type存放在偏移量为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。

转载于:https://www.cnblogs.com/zhangyz/articles/4736711.html

你可能感兴趣的文章
算法导论——基数排序(基于计数排序)
查看>>
19.TCP的交互数据流
查看>>
字符串匹配的Boyer-Moore算法
查看>>
memcached数据库未授权访问漏洞解决
查看>>
centos 7 安装在vmware Workstation的网卡问题 RHEL7
查看>>
嵌入式开发平台-iTOP-4418开发板
查看>>
我的友情链接
查看>>
ssh配置公钥私钥(key)登录SecureCRT
查看>>
go 字符串长度为空的判断 效率
查看>>
openstack安装(liberty)--安装认证服务(Identity service)
查看>>
邮件服务器软件为企业分支“搭桥”
查看>>
Windows Azure之VM的迁移之旅
查看>>
DevOps系列——Gogs和Jenkins的CI配置
查看>>
ExtJS4.2学习(php版)
查看>>
负载均衡——HAProxy
查看>>
win7 访问本机的虚拟机中centos的web项目
查看>>
批处理之播放文本文件
查看>>
windows server 2008活动目录的备份与还原
查看>>
spring boot 2.0.1.RELEASE hibernate 缓存 ehcache 详解
查看>>
关于windows7的更新update失败,windows media play安装失败的 ...
查看>>