一、sizeof与strlen的区别
1、sizeof是一个操作符,适用于计算数组、变量、指针、类型符等所占内存空间的大小,它并不关注内存中存放的具体内容,不关心里面存放了多少数据;
2、strlen是一个用来计算字符串长度的库函数,它只关心存储的数据内容,不关心空间大小和类型。
那么为什么会有人把他俩分不清呢?关键点在于字符型数组。我们讲过C语言中,没有字符串类型,字符串是以字符型数组在内存中存放的,另外,在C语言系统中,字符数组存储字符串是会自动加上一个'\0'。这就容易把大家搞混,别急,我下面举例子说明:
例1:
#include <stdio.h>
#include <string.h>
int main()
{
char arr1[]={"Chian"};
int ret =sizeof(arr1);
int ret1 =sizeof(arr1)/sizeof(arr1[0]);
int ret2=strlen(arr1);
printf("%d\n",ret);
printf("%d\n",ret1);
printf("%d\n",ret2);
return 0;
}
我定义一个数组arr1,里面存放"China",
当用sizeof(arr1)计算的是整个数组的长度,为6;
当用sizeof(arr1)/sizeof(arr1[0])计算的是数组的长度/数组中一个元素的长度,计算数组的元素个数也为6;
当用strlen(arr1)计算的数组中字符串的长度为5;
数组arr1在内存中的存储方式如图所示,sizeof计算整数数组所占的字节,由于是字符串在数组中有'\0',所以计算占用6个字节,sizeof(arr1)/sizeof(arr1[0])是总字节(6)/单个字节(1),6个元素。strlen计算字符串长度,遇到'\0'截至,长度为5;数组长度不等于字符串长度;

例2:
#include <stdio.h>
#include <string.h>
int main()
{
char arr1[]={'C','h','i','n','a'};
int ret =sizeof(arr1);
int ret1 =sizeof(arr1)/sizeof(arr1[0]);
int ret2=strlen(arr1);
printf("%d\n",ret);
printf("%d\n",ret1);
printf("%d\n",ret2);
return 0;
}
二、数组长度为什么不能在函数中计算?
如下图所示,我们定义一个数组,分别在主函数,以及调用函数中计算数组的长度;
#include <stdio.h>
int ROW(int arr[])
{
int ret;
ret=sizeof(arr)/sizeof(arr[0]);
return ret;
}
int main()
{
int arr[]={1,2,3,4,5,6};
int i=sizeof(arr)/sizeof(arr[0]);
int j =ROW(arr);
printf("%d\n",i);
printf("%d\n",j);
return 0;
}
结果为:

在主函数中计算的数组长度没有问题,那为什么在调用函数中就有问题了呢?
这是因为数组名作为参数,传递的只是首元素地址,并不是创建一个与实参一模一样大小的数组,在被调函数中,arr仅仅相当于一个指针变量,而直至变量的内存为8个字节,用它除以数字第一个元素的长度4个字节,这样剩下的数量只能是2;
指针变量的长度:
int main()
{
int * a;
int ret =sizeof(a);
printf("%d\n",ret);
}


被折叠的 条评论
为什么被折叠?



