sizeof在c语言中作用,C语言中sizeof()详解

只要参加软件研发的笔试(C/C++)几乎都会涉及到sizeof()的用法,我昨天也遇到了,有的也会,但是真正sizeof()的核心还是没有领会,今天上网,无聊中就看到了详细的sizeof()的阐述,现在分享给大家。

AAffA0nNPuCLAAAAAElFTkSuQmCC

------------sizeof----------------

sizeof 一般形式为:sizeof(object),也可以sizeof var_char,不过大部分programer习惯用sizeof()。

对象可以是表达式或者数据类型名,当对象是表达式时,括号可省略。sizeof是单目运算符,其运算符的含义是:求出对象在计算机内存中所占用的字节数。一般来讲,不同的机器,运行不同的对象是不一样的,当目前几乎所有的机器都是32位,很少16位的,所以一般考试都是基于32位的window和linux的。

欢迎大家加入小编的C/C++学习交流裙【 五二一,一一零,一三零】,无论你是大牛还是小白,是想转行还是想入行都可以来了解一起进步一起学习!裙内有开发工具,很多干货和技术资料分享!

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结果是一样的额。

欢迎大家加入小编的C/C++学习交流裙【 五二一,一一零,一三零】,无论你是大牛还是小白,是想转行还是想入行都可以来了解一起进步一起学习!裙内有开发工具,很多干货和技术资料分享!

2.浮点型数据

float,double,long double

上边的图,long double 没有测试(忘了。。。。。)呵呵!

但是应该是16。

AAffA0nNPuCLAAAAAElFTkSuQmCC

3。指针

对于指针,要特别区分,指针指向什么数据,它在内存占的字节数才是它的结果。

比如:指针指向一个字符串,就是字符串的长度,因为一个字符在内存中占一个字节。若指针指向一个数据结构,则结果应该是结构型数据的内存字节数。

欢迎大家加入小编的C/C++学习交流裙【 五二一,一一零,一三零】,无论你是大牛还是小白,是想转行还是想入行都可以来了解一起进步一起学习!裙内有开发工具,很多干货和技术资料分享!

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的倍数

欢迎大家加入小编的C/C++学习交流裙【 五二一,一一零,一三零】,无论你是大牛还是小白,是想转行还是想入行都可以来了解一起进步一起学习!裙内有开发工具,很多干货和技术资料分享!

比如: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。

作者:岑寂扶你去学C

链接:https://www.jianshu.com/p/0e7e4c978116

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值