sizeof计算的是栈中大小

P { margin-bottom: 0.21cm; direction: ltr; color: rgb(0, 0, 0); text-align: justify }
P.western { font-family: "Times New Roman", serif; font-size: 10pt }
P.cjk { font-family: "宋体", "SimSun"; font-size: 10pt }
P.ctl { font-family: "Times New Roman", serif; font-size: 12pt }

sizeof如用于数组,只能测出静态数组的大小,无法检测动态分配的或外部数组大小

首先解释下sizeof和strlen之间的区别。

sizeof是一个运算符,其类型结果为size_t,可以用类型做参数,比如在定义一个结构体之后,获得结构体空间大小sizeof(struct )。并且最重要的是sizeof返回的是变量、结构等的实际大小,并且在计算结构体时要注意对其问题。

strlen首先是一个函数,只能以char * 做参数,返回的是字符的实际长度,不是类型占内存的大小。其结果是运行的时候才计算出来的。



下面给出相关例子进行解释说明。

1、 char * s = “0987654321”;

那么sizeof(s)是多少?sizeof(*s)呢?strlen(s)呢?

sizeof(s)结果为4,因为s是指向char类型的指针。

sizeof(*s)结果为1,可以简单看为char(*s)。

strlen(s)结果为10.为实际字符串长度。



2、int a[100] = "0987654321";

那么sizeof(a)是多少?strlen(a)呢?

sizeof(a)结果为400.  100*4.

strlen(a)结果为10,也许你会这么认为。这里要注意strlen只能以char * 做参数,所以这里是错误的表达。



3、struct {                                                         struct {

                short a;                                                          long a;

                short b;                                                          short b;

                short c;                                                          char c;

}A;                                                                      }B;



那么sizeof(A)和sizeof(B)结果分别为多少?

结构体A中的数据类型都是相同的类型,都以2字节对齐,所以sizeof(A)是6字节。

结构体B中有long:4字节、short:2字节、char :1字节。那么结构体以最长的4字节对其,那么sizeof(B)就是4*3=12喽。不是。在第一个long之后,编译器将short和char放到一块窒执行内存对齐,所以这里结果应该为8字节。





4、class A                                                                                    class B

{                                                                                                  {

      public:                                                                                        public:

       int a;                                                                                          double a;

      static int b;                                                                                  float b;

                                                                                                          int c;

        A();                                                                                            char d;

        ~A();                                                                                         B();

};                                                                                                        ~B();

                                                                                                        };

那么sizeof(A)和sizeof(B)结果为多少?

根据之前的分析可以很容易得出sizeof(A)结果为8字节,如果这么想就错了!!!!!!这里的int b是静态变量,那么静态变量存放在哪里?静态变量存放在数据段,而sizeof计算的是栈中大小,所以sizeof(A)结果为4字节.
类B以8字节对齐,结果为24字节。

5、char var[10]
int test(char var[])
{
         return sizeof(var)
  };
其结果为多少?这里的var[]已经转换为*var了,所以结果为4字节。

6、class B
{
      float a;
      char b;
       int c[3];
};
那么sizeof(B)为多少。
这里是以4字节对齐的,所以结果为4+4+4*3=20字节。

sizeof()和strlen()的更多相关文章

  1. sizeof、strlen、字符串、数组,整到一块,你还清楚吗?

    写在前面 sizeof.strlen.字符串.数组,提到这些概念,相信学过C语言的人都能耳熟能详,也能谈得头头是道,但是,在实际运用中,当这些内容交织在一起时,大家却不一定能搞地清清楚楚,本文的目的正 ...

  2. sizeof和strlen的区别

    一.sizeof    sizeof(...)是运算符,而不是一个函数.    sizeof操作符的结果类型是size_t,在头文件中typedef为unsigned int,其值在编译时即计算好了, ...

  3. Sizeof与Strlen的区别与联系

    转自:http://www.cnblogs.com/carekee/articles/1630789.html 一.sizeof    sizeof(...)是运算符,在头文件中typedef为uns ...

  4. Sizeof与Strlen的区别与联系(转)

    Sizeof与Strlen的区别与联系 一.sizeof     sizeof(...)是运算符,在头文件中typedef为unsigned int,其值在编译时即计算好了,参数可以是数组.指针.类型 ...

  5. sizeof 和 strlen 的区别

    sizeof 和 strlen 都是c/c++ 中常见的符号,他们的功能是判断数组长度.那么他么到底有什么区别 1.sizeof    不是函数,而是一个操作符.字节数的计算在程序编译时进行,而不是在 ...

  6. C++-sizeof和strlen的区别

    一.sizeof    sizeof(...)是运算符,在头文件中typedef为unsigned int,其值在编译时即计算好了,参数可以是数组.指针.类型.对象.函数等.    它的功能是:获得保 ...

  7. sizeof 和 strlen 区别

    Sizeof与Strlen的区别与联系 一.sizeof    sizeof(...)是运算符,在头文件中typedef为unsigned int,其值在编译时即计算好了,参数可以是数组.指针.类型. ...

  8. sizeof()与strlen()的区别

    首先需要说明的是sizeof和strlen都可以求长度,但是却有很大的区别,简单来说可以概括为以下几点: 1.sizeof是一个关键字,而strlen确实一个函数. 2.sizeof求的是字节长度,而 ...

  9. sizeof和strlen小结

    sizeof和strlen小结 写在前面 之所以要总结一下sizeof和strlen的用法和区别,是因为这些知识可以帮助我们更加深入的理解各种数据结构在内存中的占用情况,也许表面上看好像没有多大用处, ...

随机推荐

  1. iOS摄像头和相册-UIImagePickerController常用操作

    在一些应用中,我们需要用到iOS设备的摄像头进行拍照,视频.并且从相册中选取我们需要的图片或者视频. 关于iOS摄像头和相册的应用,可以使用UIImagePickerController类来完成控制. ...

  2. webApp 开发技术要点总结

    如果你是一名前端er,又想在移动设备上开发出自己的应用,那怎么实现呢?幸好,webkit内核的浏览器能帮助我们完成这一切.接触 webkit webapp的开发已经有一段时间了,现把一些技巧分享给大家 ...

  3. C语言 在VS环境下一个很有意思的报错:stack around the variable was corrupted

    今天做一个很简单的oj来温习下c 语言 题目如下 输入 3位正整数 输出 逆置后的正整数 代码如下: #include"stdio.h"int main(){ float h,su ...

  4. busybox-1.12.2编译提示“混合的隐含和普通规则”错误解决

    编译环境:CentOs 7.1 Ubuntu 12.0.4 都可以 交叉编译工具:gcc -4.3.2 (博创6410平台) 问题描述:执行make menuconfig命令的时候,提示Makefil ...

  5. SQL复制一个表的数据到另一个表

    最近做一个项目,由于客户数据量大,为了不将数据彻底删除,于是将数据移动到历史表,原始表的数据删除.由于技术有限,想不到好的方法,于是写个存储过程 执行,为了防止执行过程中出现异常,执行不完整.用到hI ...

  6. VMWare安装Solaris虚拟机的网络设置

    虚拟机的网卡使用Host-only. 在VMWare取消Host-only的DHCP. 在虚拟机的Solaris系统里ipadm命令配置ip.

  7. Windows Azure 如何学习Azure

    通过上一篇博文可以得知,Azure其实是个平台,上面跑的服务五花八门,可以相互分开使用,同时也可以相互结合. 那我们应该如何来学习Azure呢? 其实有很多种选择,正所谓条条大路通罗马, 官方的tra ...

  8. wex5 教程 之 图文讲解 可观察对象的集群应用与绑定技术

    一 前言: wex5官方教程里,开篇即以一个input输入,output即时输出的例子,为我们展现了一个概念:可观察对象.在以后我的项目开发中,将大量运用可观察对象. 那么,问题来了: 1. 可观察对 ...

  9. 为您详细比较三个 CSS 预处理器(框架):Sass、LESS 和 Stylus

    CSS 预处理器技术已经非常的成熟,而且也涌现出了越来越多的 CSS 的预处理器框架.本文向你介绍使用最为普遍的三款 CSS 预处理器框架,分别是 Sass.Less CSS.Stylus. 首先我们 ...

  10. mysql常用命令(3)

    一.启动与关闭 1.1 Linux下启动mysql 的命令: a. rpm包安装:service mysqld start b. 源码包安装:/usr/local/mysql/bin/mysqld_s ...