惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园_首页
Blog — PlanetScale
Blog — PlanetScale
腾讯CDC
aimingoo的专栏
aimingoo的专栏
Microsoft Azure Blog
Microsoft Azure Blog
A
About on SuperTechFans
J
Java Code Geeks
G
Google Developers Blog
N
Netflix TechBlog - Medium
Vercel News
Vercel News
Y
Y Combinator Blog
Recent Announcements
Recent Announcements
I
InfoQ
Stack Overflow Blog
Stack Overflow Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
T
The Blog of Author Tim Ferriss
罗磊的独立博客
GbyAI
GbyAI
小众软件
小众软件
大猫的无限游戏
大猫的无限游戏
WordPress大学
WordPress大学
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More

博客园 - Richard

使用Expresso学习.net正则表达式 Learning .NET Regular Expressions with Expresso SWOT分析法 Symbian60第二版拍照功能实现 WindowsMobile2003拨号回拨 Windows2003Web权限问题 佣兵天下-看书 以前用过的的一个线程池代码 Symbian60平台开发环境搭建 回归 虚函数,看看吧 C# 下的struct Black Berry 无尽空虚 J2ME下访问.net的webservice 读取ini配置文件的API C#今天学的知识 急用抄过来不整理了-Access 设置控件输入的输入方式-补充
sizeof讨厌的东西
Richard · 2005-12-19 · via 博客园 - Richard

最近做了一份c语言题上面不少关于sizeof的东西,做完了然后去查书发现全都理解倒了,呵呵,赶紧找个解释的贴上来。

sizeof 总结
brutal 发表于 2005-11-8 22:40:00

sizeof操作符以字节形式给出了其操作数的存储大小。

作用:
1、sizeof操作符的一个主要用途是与存储分配和I/O系统那样的例程进行通信。
2、sizeof的另一个的主要用途是计算数组中元素的个数。

计算结果:
1、若操作数具有类型char、unsigned char或signed char,其结果等于1。
  ANSI C正式规定字符类型为1字节。

2、int、unsigned int 、short int、unsigned short 、long int 、unsigned long 、float、double、long double类型的sizeof 在ANSI C中没有具体规定,大小依赖于实现,一般可能分别为2、2、2、2、4、4、4、8、10。

3、当操作数是指针时,sizeof依赖于编译器。例如Microsoft C/C++7.0中,near类指针字节数为2,far、huge类指针字节数为4。一般Unix的指针字节数为4。

4、当操作数具有数组类型时,其结果是数组的总字节数。

5、联合类型操作数的sizeof是其最大字节成员的字节数。结构类型操作数的sizeof是这种类型对象的总字节数,包括任何垫补在内。
让我们看如下结构:
struct {char b; double x;} a;
在某些机器上sizeof(a)=12,而一般sizeof(char)+ sizeof(double)=9。
这是因为编译器在考虑对齐问题时,在结构中插入空位以控制各成员对象的地址对齐。如double类型的结构成员x放在被4整除的地址。

6、如果操作数是函数中的数组形参或函数类型的形参,sizeof给出其指针的大小。

例子:
char s1[]="";
 char s2[]="Hello world!";
 char *p = s2;
 char *q = s1;
 char *r = (char *)malloc(100);
 char str1[]="123456789";
 char *a[]={"123","asdfsdf","0kle3340j"};
 
 char s3[10]={'m','o','b','i','l'};
 char s4[20]={'A','N','S','I','\0','C','+','+'};
 char s5[8]={'I','S','O','C','+','+','M'};

 int i;
 int j = 10;
 float f;
 float k=12.45;
 long l;
 double d;

void func(char str[100])
{
 printf("sizeof---str=%d\n",sizeof(str));
}

int tenof(char par)
{
 return par*10;
}

func(str);

printf("tenof(100)=%d",tenof(100));
printf("tenof(127)=%d",tenof(127));
printf("tenof(128)=%d",tenof(128));
printf("tenof('i')=%d",tenof('i'));

=========================================

sizeof(s1)=1
sizeof(s2)=13
sizeof(p)=4
sizeof(q)=4
sizeof(r)=4
sizeof(str)=4

strlen(s3)=5
strlen(s4)=4
strlen(s5)=7

sizeof(i)=4
sizeof(j)=4
sizeof(f)=4
sizeof(k)=4
sizeof(l)=4
sizeof(d)=8

sizeof(a)=12
sizeof(a[0])=4
sizeof(a[1])=4
sizeof(a[2])=4

sizeof---str=4
tenof(100)=1000
tenof(127)=1270
tenof(128)=-1280   //a error,ASCII code 000~127 is standard.
tenof('i')=1050