只要参加软件研发的笔试(C/C++)几乎都会涉及到sizeof()的用法,我昨天也遇到了,有的也会,可是真正sizeof()的核心仍是没有领会,今天上网,无聊中就看到了详细的sizeof()的阐述,如今分享给你们。
------------
sizeof----------------
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。
----------------------
sizeof具体的,我所知道的就这些了,那位高手还知道什么,或者我写的有什么错,但愿指出。谢谢!