`
codepeak
  • 浏览: 31948 次
  • 性别: Icon_minigender_1
  • 来自: 南京
最近访客 更多访客>>
社区版块
存档分类
最新评论

sizeof相关问题

阅读更多

1. sizeof的概念:

sizeof是C的一种单目运算符,它以字节形式给出了它的操作数的存储大小。操作数可以是一个表达式或者括起来的数据类型。操作数的存储大小由操作数的类型决定。

2. sizeof的使用方法:

sizeof用于变量可以不带括号,也可以带括号,但是用于类型必须带括号;sizeof不能用于函数类型,不完全类型和位字段。不完全类型是指具有位置存储大小的类型,如未知大小的数组类型,未知内容的结构或联合,void类型等。

3. sizeof和strlen的比较:

1) sizeof是运算符,strlen是函数

2) sizeof操作符的结果类型是size_t

3) sizeof可以用类型做参数,而strlen只能用char *做参数,而且必须以'\0'结尾。

4) 数组做sizeof的参数不退化,而做strlen的参数就退化为指针。( C的一个特性:将数组作为参数传递给函数时,数组符合自动退化为指向该数组的指针。注意sizeof是运算符,而不是函数)

5) 大多数编译程序在编译时就已经将sizeof计算出来了,这也是为什么可以使用sizeof(x)定义数组大小的原因。

6) strlen的结果要在运行时才能计算出来。它是用来计算字符串长度的,而不是用来计算类型占内存的大小。

4. 经典问题:

 

double *(*a)[3][6];
cout<<sizeof(a)<<endl; //4 a为指针
cout<<sizeof(*a)<<endl;//72 *a为一个有3*6个指针元素的数组
cout<<sizeof(**a)<<endl;//24  **a为数组一维德6个指针
cout<<sizeof(***a)<<endl;//4  ***a为一维的第一个指针
cout<<sizeof(****a)<<endl;//8  ****a为一个double变量

5. 下面的程序输出:

 

#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;

struct{
          short a1;
          short a2;
          short a3;
}A;
struct{
          long a1;
          short a2;
}B;

int main()
{
          char* ss1 = "0123456789";
          char   ss2[] = "0123456789";
          char   ss3[100] = "0123456789";
          int      ss4[100];
          char    q1[] = "abc";
          char    q2[] = "a\n";
          char*   q3 = "a\n";
          char * str1 = (char*)malloc(100);
          void * str2 = (void*)malloc(100);
          
          cout<<sizeof(ss1)<<endl;//4        指针大小固定
          cout<<sizeof(ss2)<<endl;//11      10字节加上隐含的'\0'
          cout<<sizeof(ss3)<<endl;//100    预分配
          cout<<sizeof(ss4)<<endl;//400    预分配,但int占4字节
          cout<<sizeof(q1)<<endl;//4          3+1('\0')
          cout<<sizeof(q2)<<endl;//3          2+1
          cout<<sizeof(q3)<<endl;//4          指针大小固定
          cout<<sizeof(A)<<endl;//6            2*3
          cout<<sizeof(B)<<endl;//8           4+2扩展到8(32位机的long为4byte)
          cout<<sizeof(str1)<<endl;//4        指针大小固定
          cout<<sizeof(str2)<<endl;//4        。。。。。

          return 0;
}

 结构体的大小问题(数据对齐):

在默认情况下,为了方便结构体内的元素的访问和管理,当结构体内的元素的长度都小于处理器的位数的时候,以便结构体里面最长的数据元素为对其单位,也就是说,结构体的长度一定是最长的数据元素的整数倍。如果结构体内存在长度大于处理器位数的元素,那么就以处理器的位数为对其单位。但是结构体内类型相同的连续元素将在连续的空间内,和数组一样。

结构体默认的字节对齐一般满足三个原则:

1)结构体变量的首地址能够被其最宽基本类型成员变量的大小所整除;

2)结构体每个成员相对于结构体首地址的偏移量都是成员大小的整数倍,如果有需要编译器会在成员之间加上填充字节;

3)结构体的总大小为结构体最宽基本类型成员大小的整数倍,如果有需要编译器会在最末一个成员之后加上填充字节。

分享到:
评论

相关推荐

    有关strlen和sizeof的归纳与总结

    都是在网上下载资料,然后自己整理而成。详细的介绍了strlen和sizeof的区别和用法,这在应用程序是,有很高的帮助。

    sizeof的相关运算

    笔试题,关于sizeof的一些运算。。。。。

    c语言sizeof详解

    主要介绍了sizeof的概念以及相关用法,我辛辛苦苦找的,希望对大家有所帮助

    解析一个有关sizeof用法的题目–sizeof(i++)

     printf(“%d\n”, sizeof(i++)); printf(“%d\n”, i); return 0; }这三行输出应该是什么?答案是:10410第三个为什么不是11? i为什么没有自增?请看C++标准;5.3.3 sizeofThe sizeof operator yields the ...

    解析一个有关sizeof用法的题目--sizeof(i++)

    本篇文章是对一个关于sizeof用法的题目进行了详细的分析介绍,需要的朋友参考下

    java-sizeof:ScalaJava 的内存消耗估算器

    这是 Scala/Java 的内存消耗估算器。 这个库是从项目移植的。 依赖 ###Sbt libraryDependencies += "com.madhukaraphatak" %% "java-sizeof" % "0.1" 2.10 和 2.11 都支持。...有关更多示例,请查看示例文件夹。

    详解C++编程中的sizeof运算符与typeid运算符

    产生与 char 类型的大小有关的操作数大小。 语法 sizeof unary-expression sizeof ( type-name ) 备注 sizeof 运算符的结果为 size_t 类型,它是包含文件 STDDEF.H 中定义的整数类型。利用此运算符,你可以避免在...

    C/C++ 中sizeof('a')对比详细介绍

    主要介绍了C/C++ 中sizeof('a')的值对比详细介绍的相关资料,需要的朋友可以参考下

    详解C++ sizeof(下)

    主要介绍了C++ sizeof的相关资料,帮助大家更好的理解和学习c++,感兴趣的朋友可以了解下

    详解C++ sizeof(上)

    主要介绍了C++ sizeof的相关资料,帮助大家更好的理解和学习c++,感兴趣的朋友可以了解下

    C语言位运算和sizeof运算符详解

    主要介绍了C语言位运算和sizeof运算符详解的相关资料,这里提供了详细的知识要点,并附简单代码示例,需要的朋友可以参考下

    C语言中sizeof函数的基本使用总结

    主要给大家介绍了关于C语言中sizeof函数的基本使用的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。

    sizeOf-Droid:Android 上的光学测距和尺寸测量

    #sizeOf() - Droid 有关此项目的更多信息,请访问文档存储库。 ##生成用于处理的数据集 在接下来的几天里,这个过程将变得更加容易。 要生成数据集,请执行以下操作: 拿一根米尺或卷尺和一些要关注的东西 打开...

    程序员面试宝典pdf

    不仅对传统的C系语言考点做了详尽的解说,包括面向对象问题、sizeof问题、const问题、数据结构问题等。还根据外企出题最新特点,针对设计模式问题、C#问题、网络问题、数据库问题、NET问题等,做了深入的说明。 ...

    程序员面试宝典

    不仅对传统的C系语言考点做了详尽的解说,包括面向对象问题、sizeof问题、const问题、数据结构问题等。还根据外企出题最新特点,针对设计模式问题、C#问题、网络问题、数据库问题、NET问题等,做了深入的说明。, ...

    c++ 面试题 总结

    memset(a,0,sizeof(a)); int i=0,j; char t; cin.getline(a,50,'\n'); for(i=0,j=strlen(a)-1;i(a)/2;i++,j--) { t=a[i]; a[i]=a[j]; a[j]=t; } cout; } //第二种 string str; cin&gt;&gt;str; str.replace; ...

    C++无法重载点符号、::、sizeof等的原因

    主要介绍了C++无法重载点符号、::、sizeof等的原因的相关资料,需要的朋友可以参考下

    《你必须知道的495个C语言问题》

    《你必须知道的495个C语言问题》结构清晰,讲解透彻,是各高校相关专业C语言课程很好的教学参考书,也是各层次C程序员的优秀实践指南。 -----------------------------------------------------------------------...

    你必须知道的495个C语言问题

    3.5 可否用显式括号来强制执行我所需要的计算顺序并控制相关的副作用?就算括号不行,操作符优先级是否能够控制计算顺序呢? 3.6 可是&&和||操作符呢?我看到过类似while((c=getchar())!=EOF&&c!='\n')的代码……...

    你必须知道的495个C语言问题.pdf

    中文名: 你必须知道的495个C语言问题 高清PDF中文版 原名: C Programming FAQs 作者: (美)萨米特译者: 孙云 朱群英资源格式: PDF 版本: 扫描版 出版社: 人民邮电出版社书号: 9787115194329发行时间: 2009年02月01日 ...

Global site tag (gtag.js) - Google Analytics