C语言中sizeof与strlen区别
本文转载自:http://www.2cto.com/kf/201109/105100.html
1. 以字符串形式出现的,编译器都会为该字符串自动添加一个0作为结束符,如在代码中写"abc",那么编译器帮你存储的是"abc\0".
2. 字符串直接量作为字符指针的初始值
"hello"是一个字符串直接量,编译器将其作为const char*处理,与之相关联的内存空间位于内存的只读部分,即允许编译器重用指向等价字符串直接量的引用以优化内存使用,
即使程序 中使用了字符串直接量500次,编译器在内存中也只是创建了一个实例。例如: char *ptr = “hello”; 等价于 const char *ptr = “hello”;
字符串直接量"hello"关联的是只读内存,如果试图修改将出错,例如ptr[1] = ‘a’;是会引起错误的。
3. 字符串直接量作为基于栈的字符数组的初始值
由于基于栈的变量不可能引用其他地方存储的内存,编译器会负责将字符串直接量复制到基于栈的数组内存中。
例如: char stackArray[] = “hello”;
做如下修改: stackArray[1] = ‘a’;是真确的。
4. 字符数组与字符指针
字符数组的形式如下,会将字符直接量拷贝到栈上:
char str[] = "abc"; // 实际的数据存储: a b c \0,也就是增加了一个终结符\0
char str[3] = {'a','b','c'}; // 实际的数据存储: a b c,并没有在最后添加终结符
char str[10] = {'a','b','c'}; // 实际的数据存储: a b c \0 \0 \0 \0 \0 \0 \0
字符指针的形式如下:
char *str = “abc”; // 实际的数据存储: a b c \0,也就是增加了一个终结符\0
5. 类型的决定
1). 数组的类型是由该数组所存放元素的类型以及数组本身的大小决定的
如char s1[3]和char s2[4],s1的类型就是char[3],s2的类型就是char[4],也就是说尽管s1和s2都是字符数组,但两者的类型却是不同的。
2). 字符串常量的类型可以理解为相应字符常量数组的类型 如"abcdef"的类型就可以看成是const char[7],也就是说实际的数据存储为"abcdef\0"。
3). 函数参数列表中的以数组类型书写的形式参数,编译器把其解释为普通的指针类型
如对于void func(char sa[100],int ia[20],char *p),则sa的类型为char*,ia的类型为int*,p的类型为char*。
对于sizeof与strlen:
1. sizeof操作符的结果类型是size_t,它在头文件中typedef为unsigned int类型。该类型保证能容纳实现所建立的最大对象的字节大小。
2. sizeof是算符,strlen是函数。
3. sizeof可以用类型做参数,strlen只能用char*做参数,且必须是以''\0''结尾的。
4. 数组做sizeof的参数不退化,传递给strlen就退化为指针了。
5. 大部分编译程序在编译的时候就把sizeof计算过了,是类型或是变量的长度这就是sizeof(x)可以用来定义数组维数的原因。
char str[20]="0123456789"; // str是编译期大小已经固定的数组
int a=strlen(str); // a=10; //strlen()在运行起确定,计算的是实际长度
int b=sizeof(str); // 而b=20; //sizeof()在编译期确定,str的类型是int[20],计算的是占据内存的大小
6. strlen的结果要在运行的时候才能计算出来,是用来计算字符串的实际长度,不是类型占内存的大小。
7. sizeof后如果是类型必须加括弧,如果是变量名可以不加括弧。这是因为sizeof是个操作符不是个函数。
char c;
sizeof c; //变量名可以不加括弧
8. 当适用于一个结构类型或变量, sizeof 返回实际的大小,
当适用一静态地空间数组, sizeof 归还全部数组的尺寸。
sizeof 操作符不能返回动态地被分派了的数组或外部的数组的尺寸
sizeof、strlen计算字符数组、字符指针空间
char str[] = "abc"; 实际的数据存储: a b c \0,也就是增加了一个终结符\0 其类型为char[4] VS: sizeof(str)=4 strlen(str) = 3
GCC: sizeof(str)=4 strlen(str) = 3
char str[] = "abc"; 实际的数据存储: a b c \0,也就是增加了一个终结符\0 其类型为char[4] VS: sizeof(str)=4 strlen(str) = 3
GCC: sizeof(str)=4 strlen(str) = 3
char str[] = {'a','b','c'}; 实际的数据存储: a b c,并没有在最后添加终结符 其类型为char[3] VS: sizeof(str)=3 strlen(str) = 15
GCC: sizeof(str)=3 strlen(str) = 6
char str[3] = {'a','b','c'}; 实际的数据存储: a b c,并没有在最后添加终结符 其类型为char[3] VS: sizeof(str)=3 strlen(str) = 15
GCC: sizeof(str)=3 strlen(str) = 6
char str[5] = {'a','b','c','d','e'}; 实际的数据存储: a b c d e ,并没有在最后添加终结符 其类型为char[5] VS: sizeof(str)=5 strlen(str) = 19
GCC: sizeof(str)=5 strlen(str) = 8
char str[5] = {'a','b','c','d'};
实际的数据存储: a b c d \0(默认填充字符\0) 其类型为char[5] VS: sizeof(str)=5 strlen(str) = 4
GCC: sizeof(str)=5 strlen(str) = 4
char *pstr = "abcde"; 实际的数据存储: a b c d e \0 pstr的类型为char* sizeof(pstr) = 4 ( 指针的数据存储空间,4个字节),strlen(pstr) = 5
总结一下:
1). sizeof的结果是类型的大小,区分类型之后,sizeof的结果也就命了,sizeof的结果是在编译期决定的,计算的占据的内存大小。
srelen的结果是在运行期间决定,计算的是实际长度,strlen只能以char*作参数,以\0作为结束符, 以上的例子中,红色部分的strlen计算是错误的,
因为在str的数据存储中并没有 一个\0字符,所以strlen的结果看似有点异常。
2). 注意在计算sizeof的时候:
char str[] = "abc"; 类型为char[4], sizeof(str) = 4*sizeof(char) = 4.
3). sizeof(express),其中的express在编译过程中是不会被编译的,而是被替代类型。
例如: int a = 1; sizeof(a=2);
此时的express为a=2,在编译过程中被替换为sizeof(int),所以在执行完之后,a仍然是等于1.
4). 对函数使用sizeof,在编译阶段会被替换为函数的返回值的类型取代
例如: int f(){return 0;} sizeof(f());的结果为4.
void f(){} sizeof(f());编译过程中会出现错误,替换之后的sizoeof(void)编译无法通过.
C语言中sizeof与strlen区别的更多相关文章
- C语言中sizeof、strlen函数的部分理解
一.测试环境 Win10 + Visual Studio 2017 二.测试代码 #include "pch.h" #include <iostream> #inclu ...
- C语言中sizeof与strlen的区别
1.sizeof sizeof为编译时期被替换,不会等到程序运行再来判断,所以sizeof返回的是数组的总字节数 #include<stdio.h> int main() { ]={'a' ...
- 对C语言中sizeof细节的三点分析
转自对C语言中sizeof细节的三点分析 1.sizeof是运算符,跟加减乘除的性质其实是一样的,在编译的时候进行执行,而不是在运行时才执行. 那么如果编程中验证这一点呢?ps:这是前两天朋友淘宝面试 ...
- C语言中sizeof()的用法
语法 sizeof有三种语法形式: 1.sizeof(object); //sizeof(对象); 2.sizeof(type_name); //sizeof(类型); 3.sizeof object ...
- sizeof 和 strlen 区别
Sizeof与Strlen的区别与联系 一.sizeof sizeof(...)是运算符,在头文件中typedef为unsigned int,其值在编译时即计算好了,参数可以是数组.指针.类型. ...
- sizeof和strlen区别(转)
char str[20]="0123456789"; int a=strlen(str); /*a=10;strlen 计算字符串的长度,以\0'为字符串结束标记. int ...
- sizeof和strlen()区别及用法
//sizeof是以字节为单位计算变量或类型所占内存大小,它是属于C语言运算符系列:而strlen()是一个函数,是计算字符串长度(也是以字节为单位,但略有区别):比如: char array[] = ...
- sizeof和strlen()区别
sizeof关键字和strlen()标准函数都可以用来测试字符串的长度,但是两者有很大的不同 sizeof只能在本函数内, 使用""和不指定长度的字符数组中才能测出字符串的真实长度 ...
- sizeof和strlen区别
sizeof(...)是运算符,在头文件中typedef为unsigned int,其值在编译时即计算好了,参数可以是数组.指针.类型.对象.函数等 数组:编译时分配的空间大小 指针:指针所占的空间, ...
随机推荐
- Android studio - Failed to find target android-18
看了一下国外的解决方案,好多人也都遇到此类问题.看老外的聊天,由衷觉得着实的可爱,同时外国的月亮也不见得比国内的圆.以下是他们的对话(最后有一个小总结): I have a problem wit ...
- PGM:部分观测数据
http://blog.csdn.net/pipisorry/article/details/52599451 基础知识 数据缺失的三种情形: 数据的似然和观测模型 Note: MLE中是将联合概率P ...
- 理解性能的奥秘——应用程序中慢,SSMS中快(4)——收集解决参数嗅探问题的信息
本文属于<理解性能的奥秘--应用程序中慢,SSMS中快>系列 接上文:理解性能的奥秘--应用程序中慢,SSMS中快(3)--不总是参数嗅探的错 前面已经提到过关于存储过程在SSMS中运行很 ...
- 一道有趣的Twitter技术面试题
来自:http://blog.jobbole.com/50705/ 看下面这个图片” “在这个图片里我们有不同高度的墙.这个图片由一个整数数组所代表,数组中每个数是墙的高度.上边的图可以表示为数组[2 ...
- JAVA面向对象-----成员内部类的访问方式
成员内部类的访问方式 1.内部类可以直接访问外部类的成员属性.(孙悟空相当于内部类飞到牛魔王的肚子里面去). 2.外部类需要访问内部类的成员属性时需要创建内部类的对象. 1.在外部类的成员函数中创建内 ...
- 手把手图文并茂教你用Android Studio编译FFmpeg库并移植
转载请把头部出处链接和尾部二维码一起转载,本文出自逆流的鱼yuiop:http://blog.csdn.net/hejjunlin/article/details/52661331 之前曾写过一篇&l ...
- android view事件分发机制
首先我们先写个简单的例子来测试View的事件转发的流程~ 1.案例 为了更好的研究View的事件转发,我们自定以一个MyButton继承Button,然后把跟事件传播有关的方法进行复写,然后添加上日志 ...
- UNIX网络编程——利用recv和readn函数实现readline函数
在前面的文章中,我们为了避免粘包问题,实现了一个readn函数读取固定字节的数据.如果应用层协议的各字段长度固定,用readn来读是非常方便的.例如设计一种客户端上传文件的协议,规定前12字节表示文件 ...
- Android简易实战教程--第八话《短信备份~一》
各种手机助手里面都包含了短信备份这一项.短信的本分主要包含四项:内容body.事件date.方式type.号码address. 短信备份~一.使用一种很笨的方式来保存短信到xml文件中,而且保存在外部 ...
- Android的Notification的简介-android学习之旅(四十一)
Notification简介 Notification位于手机饿最上面,用于显示手机的各种信息,包括网络状态,电池状态,时间等. 属性方法介绍 代码示例 package peng.liu.test; ...