聊聊 sizeof 运算

在这两次的课上,同学们已经学到了数组了。下面几节课,应该就会学习到指针。这个速度的确是很快的。

对于同学们来说,暂时应该也有些概念理解起来可能会比较的吃力。

先说一个概念叫内存的错误访问。对应的运行错误可能是段错误等。同学们暂时脑海中有这个概念而不用深究。

内存的访问错误,多数情况下都是数组和指针导致的。这里简单的说下如何使用sizeof运算符避免数组中的错误访问。

假设有这样的一个数组,char a[11],之前,如果想要将这个数组填充满,大家可能使用这样的做法:

for(int i = 0;i < 11;i++)
{
a[i] = i;
}

但是,要是哪天小手一抖,或者是一些其他的情况,比如忽然发现,哎a本来是想要存储helloworld的,

可以存下,但是我现在要存储hello,要不我将a设置的小一点,比如char a[6]。这时候,如果不更改这个for循环,就会出现尴尬的问题,for循环会继续去尝试访问a[6...10],而实际上,并不存在。

假如使用sizeof运算符,就可以很好的避免这一尴尬的事情发生。以上的for循环代码就变成了:

for(int i = 0;i < sizeof(a)/sizeof(a[0]);i++)
{
a[i] = i;
}

(其实以上的代码稍微有点多此一举。)

这里, 简单的说下sizeof运算符的用法:

  • sizeof(字面量):它将会尽量的匹配这个尝试,比如如果字面量是1,它试图理解为int,如果字面量是3.14,它试图理解为一个float,如果是"helloworld",则试图理解为一个字符串。
#include<stdio.h>

int main(){
printf("%d %d %d\n",sizeof(1),sizeof(3.14),sizeof("helloworld"));
return 0;
}
// 结果分别为 4 8 11(64 位系统,64 位编译器)
  • sizeof(类型):如果传递进去的是数据的类型,则返回这个类型的字节宽度。
#include<stdio.h>

int main(){
printf("%d %d %d\n",sizeof(char),sizeof(int),sizeof(float));
return 0;
}
// 结果分别为 1 4 4(64 位系统,64 位编译器)
  • sizeof(指针):返回系统指针的空间大小。比如在 32 位系统中,指针的宽度是 4 字节,在 64 位系统中,是 8 字节。这里需要扩展一个东西,就是当函数的参数是数组的情况。实际上,当一个函数的参数中存在数组,实际上将会退化为一个指针,那么在这个函数中进行 sizeof 运算时,实际上和求指针的长度别无二致。
#include<stdio.h>

int getsize(char a[]){
return sizeof(a);
} int main(){
char a[10] = "hello";
char *ap = a;
int *b;
*b = 10;
printf("%d %d %d %d\n",sizeof(a),sizeof(ap),sizeof(b),getsize(a));
return 0;
}
// 10 8 8 8(64 位系统,64 位编译器)

最后一段代码,对于当前的同学们来说是没有办法理解的,同学们仅需要有一个印象,等学习到后面的课程再行理解。

聊聊 C 语言中的 sizeof 运算的更多相关文章

  1. C语言中的位运算和逻辑运算

    这篇文章来自:http://blog.csdn.net/qp120291570/article/details/8708286 位运算 C语言中的位运算包括与(&),或(|),亦或(^),非( ...

  2. C/C++语言中的位运算

    在计算机程序中,数据的位是可以操作的最小数据单位,理论上可以用“位运算”来完成所有的运算和操作. 一般的位操作是用来控制硬件的,或者做数据变换使用,但是,灵活的位操作可以有效地提高程序运行的效率.C语 ...

  3. C语言 malloc()与sizeof运算的盲点

    //malloc()与sizeof运算的盲点 #include <stdio.h> #include <stdlib.h> #include <string.h> ...

  4. C语言中的位运算的技巧

    一.位运算实例 1.用一个表达式,判断一个数X是否是2的N次方(2,4,8,16.....),不可用循环语句. X:2,4,8,16转化成二进制是10,100,1000,10000.如果减1则变成01 ...

  5. 聊聊Java语言中的单例

    package com.xinke.mybatis.test; public class TestSingleton { private static TestSingleton ts = null; ...

  6. C语言中的模运算-hdu6124(打表,找规律)

    题目链接:https://vjudge.net/problem/HDU-6124 题目描述: 题目大意就是给你一个数,判断这个数 % 其它数后共有几种结果. 这题对我来说最大的难点是我不太知道每个数 ...

  7. C语言中的指针运算

    int a[5]={1,2,3 ,4,5} *p=a; *p++ 等价于*(p++) 等价于a[i++](i++ i首先会被使用任何进行自+) *++p等价于*(++p) 等价于 a[++i] (++ ...

  8. 【转】C语言中整型运算取Ceiling问题

    原文:http://blog.csdn.net/laciqs/article/details/6662472 --------------------------------------------- ...

  9. C语言中复数运算及调用blas,lapack中复数函数进行科学计算

    C语言中常用的数据类型主要int, float ,double ,char 等,但在科学运算中复数扮演着重要角色.这里讲下C语言中的复数运算以及如何调用blas,lapack库中的复数函数来进行科学计 ...

随机推荐

  1. Spring JdbcTemplate

    参考链接: https://my.oschina.net/u/437232/blog/279530 http://jinnianshilongnian.iteye.com/blog/1423897 J ...

  2. Android 5.0源码编译问题

    如果是自己通过repo和git直接从google官网上download的源码,请忽略这个问题,但是由于google在国内被限制登录,通过这一种方法不是每个人都能download下来源码,通常的做法就是 ...

  3. 获取asp.net服务器控件的客户端ID和Name

    前几天在做项目的时候,遇到一个问题,想查看Asp.net中服务器控件在客户端显示的name属性.起初,感觉不是很难找,但就是找不到,几经周折,终于发现了: string btnClientName = ...

  4. VMware12下安装Debian8.5

    参考:  Debian 8.2.0 (Jessie) 快速纯净安装教程    Debian 7 安装配置总结    Debian 7.8 系统安装配置过程 软件包管理命令    包命令    从源代码 ...

  5. [更新]跨平台物联网通讯框架 ServerSuperIO v1.2(SSIO),增加数据分发控制模式

    1.[开源]C#跨平台物联网通讯框架ServerSuperIO(SSIO) 2.应用SuperIO(SIO)和开源跨平台物联网框架ServerSuperIO(SSIO)构建系统的整体方案 3.C#工业 ...

  6. css知多少(11)——position

    1. 引言 本文将用一篇文章介绍position(定位),在学习position之前,我们应该去思考一个问题:什么情况下我们需要定位?如果没有定位将无法满足我们怎样的需求?我们要知道,被人类创造出来的 ...

  7. SharePoint 2013 开发教程

    做了SharePoint有三年了,大家经常会问到,你的SharePoint是怎么学的,想想自己的水平,也不过是初级开发罢了.因为,SharePoint开发需要接触的东西太多了,Windows操作系统. ...

  8. [Android]Android端ORM框架——RapidORM(v2.1)

    以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/6020412.html [Android]Android端ORM ...

  9. JavaScript—从数组的indexOf方法深入——Object的Property机制。

    在js中,可以说万物皆对象(object),一个数组也是一个对象(array). 很多对象都有很多很方便的方法 比如数组的push,concat,slice等等,但是如果一些对象,它没有实现这些方法, ...

  10. SQLite使用(二)&&数据类型

    1.概述 我们熟知的数据库引擎大部分采用静态数据类型,即列定义的类型定义了值的存储,并且值要严格满足列的定义,同一列所有值的存储方式都相同,比如定义了一个列类型为整型 int,不能在该列上输入'abc ...