sizeof和strlen区别以及使用情况分析

实际做开发项目中,如果有涉及到字符数据处理等情况,都会遇到数据长度的获取。比如现在需要对a[50]数组进行赋值1~50的指定数据,代码如下:

char a[50];
for(i = 0 ; i <50 ; i++)
{
    a[i]=i+1;
}

如果50长度未知的情况,又应该如何为数组赋值?想到的就是获取数组长度(元素个数)然后再赋值(解决方法见文末)。C标准函数库有自带获取数据长度的函数:sizeof和strlen。但用这两函数还是有区别的。


sizeof

sizeof 并不是一个函数,而是操作符(operator),其作用就是返回一个对象的内存或者一个类型所占用的字节数
上面提到所占用的字节数对同一种类型在不同位数处理器的字节数是不一样的,这个要切记。下表是总结不同类型在不同处理器下的占用字节数。
这里写图片描述

因此sizeof用法如下:

  1. 在32位处理器下,针对char a[50],要计算a数组占用内存大小:sizeof(a) = 50字节,
    如果针对int a[50],则a数组占用内存大小:sizeof(a) = 50*4=200字节.
  2. sizeof也可以直接计算某个类型的字节数,如在16位处理器中sizeof(int)=2字节;在32位处理器中sizeof(int)=4字节。

strlen

strlen用于专门处理处理字符串,返回字符串的字符长度的,strlen是一个函数,不是操作符。其形参只能是char*型。用法如下:

如针对一个字符串数组:
char a[10]=”12345”;
则使用函数:strlen(a)=5。字符串长度为5。

虽然数组长度占用内存为10,当实际存储字符串只有5个。strlen将数组进行遍历,直到结束符’\0’才结束计算。

两者区别分析与使用

以上对sizeof和strlen的描述,读者对这两个也有了基本了解。以32位处理器为例,用两个简单例子可以比较清楚两者的区别:

  1. 已知:char a[10]=”12345”;
    则:
    sizeof(a) =10*sizeof(char)=10*1=10字节长度
    strlen(a)=5字符长度

  2. 已知:int a[10]={11,22, 33,44,55};
    则:
    sizeof(a) =10*sizeof(int)=10*4=40字节长度
    strlen(a)无法使用,针对char型字符。

因此区别总结如下:

sizeof返回的是内存的字节长度,和数组元素个数无关,和数组定义的元素个数以及处理器位数有关。

strlen只针对字符串,计算字符串内字符的个数,与数组定义的元素个数无关。

再回到文章开头的问题:现在需要对a[length]数组进行赋值1~length的指定数据(其中并不清楚length的值)。应该采用sizeof比较合理(无论几位处理器)。

//sizeof(a)/sizeof(char)相当于获取到了数组长度(元素个数)
for(i = 0 ; i <sizeof(a)/sizeof(char) ; i++)
{
    a[i]=i+1;
}

猜你喜欢

转载自blog.csdn.net/ludaoyi88/article/details/76768922
今日推荐