sizeof和strlen的区别及使用详解

sizeof和strlen的区别及使用详解

本文链接:https://blog.csdn.net/magic_world_wow/article/details/80500473

首先我们来看一下sizeof和strlen的区别:

sizeof操作符的结果类型为size_t(The sizeof keyword gives the amount of storage, in bytes, associated with a variable or a type (including aggregate types). This keyword returns a value of type size_t.)(它在头文件用typedfe定义为unsigned int类型),计算的是分配空间的实际字节数。strlen结果类型也为size_t(size_t strlen( const char *string )),但strlen是计算的空间中字符的个数(不包括‘\0’)。

sizeof是运算符,可以以类型、函数、做参数 。strlen是函数,只能以char*(字符串)做参数。而且,要想得到的结果正确必须包含 ‘\0’(通过strlen的实现得知)。

sizeof是在编译的时候就将结果计算出来了是类型所占空间的字节数,所以以数组名做参数时计算的是整个数组的大小。而strlen是在运行的时候才开始计算结果,这是计算的结果不再是类型所占内存的大小,数组名就退化为指针了。

另外,sizeof不能计算动态分配空间的大小如:

#include<stdio.h>#include<stdlib.h>#include<string.h>int main(){ char str[20] = "hello world"; char *s = (char *)malloc(20); strcpy(s, str); printf("strlen(str)=%d\n",strlen(str)); printf("sizeof(str)=%d\n",sizeof(str)); printf("strlen(s)=%d\n",strlen(s)); printf("sizeof(s)=%d\n",sizeof(s)); free(s); return 0;}

结果为:

最后的sizeof计算的是指针(sizeof(char *)) 的大小,为4。当适用了于一个结构类型时或变量, sizeof 返回实际的大小, 当适用一静态地空间数组, sizeof 归还全部数组的尺寸。 sizeof 操作符不能返回动态地被分派了的数组或外部的数组的尺寸。

下面我们来看一看sizeof和strlen的具体使用:

首先看几个例子 :

第一个例子:

char* s = "0123456789";sizeof(s); //结果 4 ===》s是指向字符串常量的字符指针sizeof(*s); //结果 1 ===》*s是第一个字符strlen(s); //结果 10 ===》有10个字符,strlen是个函数内部实现是用一个循环计算到\0为止之前strlen(*s); //结果 10 ===》错误char s[] = "0123456789";sizeof(s); //结果 11 ===》s是数组,计算到\0位置,因此是10+1strlen(s); //结果 10 ===》有10个字符,strlen是个函数内部实现是用一个循环计算到\0为止之前sizeof(*s); //结果 1 ===》*s是第一个字符char s[100] = "0123456789";sizeof(s); //结果是100 ===》s表示在内存中的大小 100×1strlen(s); //结果是10 ===》strlen是个函数内部实现是用一个循环计算到\0为止之前int s[100] = "0123456789";sizeof(s); //结果 400 ===》s表示再内存中的大小 100×4strlen(s); //错误 ===》strlen的参数只能是char* 且必须是以‘\0‘结尾的char q[]="abc";char p[]="a\n";sizeof(q),sizeof(p),strlen(q),strlen(p);\\结果是 4 3 3 2char p[] = {"a","b","c","d","e","f","g","h"};char q[] = {"a","b","c","d,"\0","e","f","g"};sizeof(p); //结果是8 ===》p表示在内存中的大小 8×1strlen(p); //为一个随机值,结果与编译器有关,不同编译器结果一般不同sizeof(q); //结果是8 ===》p表示在内存中的大小 8×1strlen(q); //结果为4 ===》存在"\0",遇到"\0"计算停止。

第二个例子

struct Stu{int i;int j;char k;};Stu stu;printf("%d\n",sizeof(Stu)); //结果 12 ===》内存补齐printf("%d\n",sizeof(stu));; //结果 12 ===》内存补齐 这个例子是结构体的内存对齐所导致的,计算结构变量的大小就必须讨论数据对齐问题。为了CPU存取的速度最快(这同CPU取数操作有关,详细的介绍可以参考一些计算机原理方面的书),C语言在处理数据时经常把结构变量中的成员的大小按照4或8的倍数计算,这就叫数据对齐(data alignment)。这样做可能会浪费一些内存,但理论上速度快了。当然这样的设置会在读写一些别的应用程序生成的数据文件或交换数据时带来不便,如有不理解的可以看看另外关于一篇内存对齐

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。

http://www.vnetpros.com/style/images/nopic.gif
我要收藏
赞一个
踩一下
分享到

分享
评论
首页