比较分析与数组相关的sizeof和strlen
// 形如:
int a[]={1,2,3,4,5};
char name[]="abcdef";
无论是整型数组还是字符数组,数组名作为右值的时候都代表数组首元素的首地址。
数组发生降级(数组名退化为数组首元素的地址)的情况:数组传参、数组名参与运算
数组名不会发生降级的情况:sizeof(数组名)、取地址数组名(取到的是整个数组的地址而不是首元素的地址)
(以下结果都经过VS2013验证)
我们先来定义两个整型数组:
int a[] = { 1, 2, 3, 4 };
int p[5] = { 1, 2, 3, 4 };
printf("%d\n", p[4]);
printf("%d\n", sizeof(p)); //20
printf("%d\n", sizeof(a)); //16
数组a未定义数组的大小,sizeof(a)的结果是16;数组p定义了数组的大小,sizeof(p)的结果是20,系统会默认将p[4]初始化为0;不论是a还是p,都求的是整个数组的大小
sizeof(a)其中有四个整型,一个整型4个字节,4*4=16个字节
int a[] = { 1, 2, 3, 4 };
printf("%d\n", sizeof(a + 0)); //4
因为数组名a参与运算发生了降级,变为首元素的地址,a+0依旧是首元素的地址,相当于求sizeof(&a[0]) ,而一个地址本身是四个字节
int a[] = { 1, 2, 3, 4 };
printf("%d\n", sizeof(*a)); //4 对首元素的地址进行解引用取到首元素的值,为int型
printf("%d\n", sizeof(a + 1)); //4 sizeof(&a[1])
printf("%d\n", sizeof(a[1])); //4 数组的每个元素都是整型
printf("%d\n", sizeof(&a)); //4 取到整个数组的地址(地址为四个字节存储)
printf("%d\n", sizeof(&a + 1)); //4 地址的大小为四个字节
printf("%d\n", sizeof(&a[0])); //4 地址的大小为四个字节
printf("%d\n", sizeof(&a[0] + 1)); //4 地址的大小为四个字节
printf("%d\n", sizeof(*&a)); //16 &a取到整个数组的地址,再解引用取到整个数组
sizeof(&a)在高版本的编译器下结果都为4,在低版本如VC6.0中为16(这或许是VC6.0的一个BUG)
分析了int型数组的情况,我们再来看看char型数组的情况:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>char name1[10]; //定义全局性数组 系统默认初始化为'\0'
int main()
{char name[10];printf("%d\n" , sizeof(name)); // 10printf("%d\n" , strlen(name)); // 随机值printf("%d\n" , sizeof(name1)); // 10printf("%d\n" , strlen(name1)); // 0 system("pause" );return 0;
}
定义在全局的数组,及时你没有初始化,系统也会默认初始化为0,而name1在这里是char类型,所以编译器会自动把它初始化为"\0".
sizeof(name)依旧算的是数组的大小,而strlen是遇到"\0"就结束
由于name没有初始化,strlen(name)的结果是个随机值,什么时候遇到"\0",就什么时候停下来。
//***********************************************************************************//char name[] = "abcdef" ; // 6个字符还有一个"\0"
printf("%d\n" , sizeof(name[0])); // 1 name[0]='a' char一个字节存储
printf("%d\n" , sizeof(&name)); // 4 取到整个数组的地址 地址为四字节存储
printf("%d\n" , sizeof(*name)); // 1
printf("%d\n" , sizeof(&name + 1)); // 4 地址! (把整个数组都跳过去了)
printf("%d\n" , sizeof(name + 1)); // 4 数组名参与运算降级为地址 ==> sizeof(&a[1])
printf("%d\n" , sizeof(name)); // 10 数组的大小
printf("%d\n" , strlen(name)); // 6 遇到'\0'就结束
printf("%d\n" , strlen(&name)); // 6
//printf("%d\n", strlen(*name)); // 无效
printf("%d\n" , strlen(&name + 1)); // 随机值
printf("%d\n" , strlen(name + 1)); // 5 为跳过首元素后的"bcdef"的长度//***********************************************************************************//
strlen(&name) :strlen函数一个字符一个字符跳转,直到遇到'\0'才结束。 这里编译器进行隐式的强制类型转换成char*,相当于在求strlen(name)
strlen(&name + 1):这是一个随机值,因为&name + 1把整个数组都跳过去了,传给strlen的参数是name数组后面未可知的地址,strlen会一直走下去,直到遇到"\0"
sizeof(*name):name发生降级,变为首元素的首地址,再解引用取到字符'a'(*name='a'),输出1
转载于:https://blog.51cto.com/iynu17/1757693
相关文章:
Python正则表达式,看这一篇就够了
作者 | 猪哥来源 | 裸睡的猪(ID: IT--Pig)大多数编程语言的正则表达式设计都师从Perl,所以语法基本相似,不同的是每种语言都有自己的函数去支持正则,今天我们就来学习 Python中关于 正则表达式的函数。re模块主要定义了…
Spring MVC 4
Spring MVC 4 项目文件结构 pom.xml依赖 <properties><endorsed.dir>${project.build.directory}/endorsed</endorsed.dir><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies> …

SQL Server 2008高可用性系列:数据库快照
SQL Server 2008高可用性系列:数据库快照http://database.51cto.com 2010-09-13 14:45 我爱菊花 博客园 我要评论(0)摘要:我们今天要讨论的话题是数据库快照。在SQL Server 2008高可用性中,快照是一项很重要的内容,可以提供至…

PostgreSQL 9.3 beta2 stream replication primary standby switchover bug?
[更新]已有patch. 请参见.PostgreSQL 9.1,9.2,9.3 clean switchover Primary and Standby Patch. http://blog.163.com/digoal126/blog/static/16387704020136197354054/打补丁前的测试 : PostgreSQL 9.3 beta2 无法完成正常的主备角色切换.Primary : psql checkpont; pg_cont…

Apache commons-io
添加引用 <dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.4</version></dependency>按行写: public static void writeFileLineByApacheIO(String fileContent) throws…

Oracle Exadata 简介
随着企业业务的发展,大型数据仓库越来越多,其规模也在迅速扩大,平均每两年规模增大3倍。大型数据仓库要求以最高的磁盘读取速度扫描几十、几百或几千个磁盘,只有磁盘和服务器之间的管道带宽增加10倍或更多才能满足此要求ÿ…
推荐系统的价值观
作者丨gongyouliu来源丨大数据与人工智能(ID: ai-big-data)推荐系统作为满足人类不确定性需求的一种有效工具,是具有极大价值的,这种价值既体现在提升用户体验上,又体现在获取商业利润上。对绝大多数公司来说ÿ…

PostgreSQL md5 auth method introduce, with random salt protect
在上一篇BLOG中介绍了不要在pg_hba.conf中使用password认证方法, 除非你的客户端和数据库服务器之间的网络是绝对安全的.http://blog.163.com/digoal126/blog/static/1638770402013423102431541/MD5方法,认证过程 : Encrypting Passwords Across A Network The MD5 authenticat…
常用Maven收集以及Maven技巧
1.完整的Maven的pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation"http://maven.apach…
大促下的智能运维挑战:阿里如何抗住“双11猫晚”?
作者 | 阿里文娱技术专家子霖出品 | AI科技大本营(ID:rgznai100)2019 双 11 猫晚在全球近 190 个国家和地区播出,海外重保是首要任务,如何提升海外用户观看猫晚的体验?本文将详解双 11 猫晚国际化的技术挑战和技术策略…

这次真的是下定决心了
这次我想是真的,真的。 上上周买了一本书 数据结构 c版 看到这本书的重点 线性表第三节,看不下去了,由于我模板学的不怎么样,数据结构c版大部分涉及了c 的模板,而且我觉得这本书上的代码有些漏洞。上上周买书的第三天…

子弹实例化的代码
using UnityEngine; using System.Collections;public class fire : MonoBehaviour {public float rate 0.2f;public GameObject bullet;private void Start(){OnFire();}//实例化子弹public void Fire(){GameObject.Instantiate(bullet, transform.position, Quaternion.iden…
Shiro源码学习之一
一.最基本的使用 1.Maven依赖 <dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-core</artifactId><version>1.2.4</version></dependency><dependency> <groupId>org.slf4j</groupId> …

传百度要与阿里、腾讯争夺在线办公市场?“百度Hi”开放520人同时在线音视频会议
在线办公市场持续火热。4月20日,百度旗下在线办公平台“百度Hi”再升级,正式发布业内大规模的520人音视频会议,并支持多入口快速入会,加码在线办公。另有消息称,4月底,百度在线办公平台将发布重磅升级&…

SQL 2008 安装资料及下载地址
SQL Server 2008 序列号: Developer: PTTFM-X467G-P7RH2-3Q6CG-4DMYB Enterprise: JD8Y6-HQG69-P9H84-XDTPG-34MBB 服务器设置SQL Server 代理 NT AUTHORITY\SYSTEMSQL Server Database Engine NT AUTHORITY\NETWORK SERVICE SQL Server Browser 默认 SQL Ser…

Objective-C非正式协议与正式协议
为什么80%的码农都做不了架构师?>>> 类别与类扩展的区别: ①类别中只能增加方法; ②是的,你没看错,类扩展不仅可以增加方法,还可以增加实例变量(或者合成属性)ÿ…
Shiro源码学习之二
接上一篇 Shiro源码学习之一 3.subject.login 进入login public void login(AuthenticationToken token) throws AuthenticationException {clearRunAsIdentitiesInternal();Subject subject securityManager.login(this, token);PrincipalCollection principals;String hos…

Widgets 整理
1.滑动条 http://www.newnaw.com/pub/sl/031.html <--!grid中的内容--> <Grid x:Name"slidergrid" HorizontalAlignment"Left" VerticalAlignment"Center" Background"Azure" Margin"20"> <StackPane…
黑客用上机器学习你慌不慌?这 7 种窃取数据的新手段快来认识一下!
作者 | IrrfanAk译者 | 天道酬勤、Carol 责编 | Carol出品 | AI科技大本营(ID:rgznai100)机器学习以分析大型数据集和模式识别的能力而闻名。它基本上属于人工智能的一个子集。而机器学习使用的算法,是利用了先前的数据集和统计分析来做出假设…

ServletResponse-中文名的下载
2019独角兽企业重金招聘Python工程师标准>>> package com.httpServletResponse; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.net.URLEncoder; import javax.servlet.ServletException; import javax.se…
Linux环境编译安装OpenJDK
Centos6.5 AMD64位机器 Java的源码是C,C和Java实现的,所以还需要有一个安装好的java建议选OracleJDK参考文末 安装OracleJDK Linux环境安装卸载JDK以及安装Tomcat和发布Java的web程序 安装依赖 | Install dependence # yum -y install gcc gcc-c alsa-lib alsa-…
最快69秒逆向DRAM地址映射,百度设计的这款逆向工具如何做到快速可靠?
来源 | 百度安全实验室出品 | AI科技大本营(ID:rgznai100)导读:近日,国际顶级设计自动化大会DAC大会公布DAC 2020会议议程和论文名单,由百度安全发表的《DRAMDig: AKnowledge-assisted Tool to Uncover DRAM Address M…

国外厂商在行业客户上输单的原因
这两天听一个朋友聊天发泄,他在一家总代J公司工作,代理业内排行第一的国外厂商C公司的产品,他负责D行业在南方某几个省的销售业务,工作中需要与C公司的销售紧密配合。经过接近一年的工作,他拿到一些项目,但…

[android] 从gallery获取图片
效果就是点击按钮,打开系统图库应用,可以选择一张里面的图片展示出来 设置隐式意图 获取Intent对象,通过new出来 调用Intent对象的setAction()方法,设置动作,参数:Intent.ACTION_PICK 调用Intent对象的setT…
调试JDK源码-HashSet实现原理
调试JDK源码-一步一步看HashMap怎么Hash和扩容 调试JDK源码-ConcurrentHashMap实现原理 调试JDK源码-HashSet实现原理 调试JDK源码-调试JDK源码-Hashtable实现原理以及线程安全的原因 代码 Set<String> snew HashSet<String>();s.add("http://blog.csdn.ne…
Python 炫技操作:海象运算符的三种用法
作者 | 明哥来源 | Python编程时光(ID:Cool-Python)Python 版本发展非常快,如今最新的版本已经是 Pyhton 3.9,即便如此,有很多人甚至还停留在 3.6 或者 3.7,连 3.8 还没用上。很多 Python 3.8 的特性还没来…

2010.10.30 OA 项目组一周工作报告
本周基本上实现了上周的目标,但和计划相比有落后。 进度:55 本周提交了3.0任务评估的第一个版本,一共为1003小时,客户收到该评估后,对3.0任务进行了调整,将部分任务移到2011.2版本中,同时添加了…

继承log4.net的类
using System; using System.Diagnostics;[assembly: log4net.Config.XmlConfigurator(Watch true)] namespace Hbl.Core {public static class Log{/// <summary>/// 一般错误/// </summary>/// <param name"message">消息</param>public …
调试JDK源码-Hashtable实现原理以及线程安全的原因
调试JDK源码-一步一步看HashMap怎么Hash和扩容 调试JDK源码-ConcurrentHashMap实现原理 调试JDK源码-HashSet实现原理 调试JDK源码-调试JDK源码-Hashtable实现原理以及线程安全的原因 Hashtable是线程安全的,我们从源码来分析 代码很简单 Hashtable<String, …

源代码查看工具 Source Navigator 使用心得
在ubuntu 10.04下试用了Source Navigator,有条件还是装Source insight吧,不是一个级别的,非常不方便。 Source Navigator 是Red Hat出品的一款查看源代码的工具,非常好用,与Windows下的Source Insight有一敌。但是它的…