C语言学习之sizeof与strlen

1.二者的概念

        1.sizeof

        sizeof是C语言中的一个关键字,sizeof(a)表示的是a所占内存空间的大小,单位是字节。在字符数组中会统计‘\0’所占空间。其返回类型为size_t类型,C99和C11提供%zd转换说明匹配sizeof的返回类型(即,size_t类型)。一些不支持C99和C11的编译器可用%u和%lu代替%zd。

        2.strlen

        strlen是string库中的的一个库函数,其参数是一个指向字符串常量或者字符数组的的指针,用于计算指针指向的字符串的大小,当遇到‘\0’停止计数,不会统计‘\0’。

2.sizeof在数组中的使用

        我们知道,对于一个数组,其数组名往往代表其首元素首地址,但也存在着特殊情况,当数组名与sizeof()一起使用时,数组名代表整个数组,即:

sizeof(arr1);            ----------------arr1数组所占内存总大小

sizeof(arr1[0]);        ----------------arr1数组其中一个元素所占内存大小


因此,利用这个特点,我们可以求出某个数组所包含的元素个数

int count=sizeof(arr1)/sizeof(arr1[0]);    //arr1的元素个数

2.在整形数组中的使用

根据上述概念,我们来看段代码(由于strlen()函数只适用于字符串,故不使用):

#include
#include
int main()
{
	int arr1[5] = { 1,2,3,4,5 };
	int arr2[6] = { 1,2,3,4,5 };
	printf("%d\n",sizeof(arr1));
	printf("%d\n",sizeof(arr2));
	return 0;
}

由于1个整形数据占4个字节,arr1开辟了大小为5个整形的空间,arr2开辟了大小为6个整形的空间,故输出如下: 

20

24

 3.在字符数组中的使用

代码如下:

int main()
{
	char arr3[5] = { 'h','e','l','l','o' };
	char arr4[6] = { 'h','e','l','l','o' };
	printf("%d\n", strlen(arr3));
	printf("%d\n", sizeof(arr3));
	printf("%d\n",strlen(arr4));
	printf("%d\n",sizeof(arr4));
	return 0;
}

输出结果如下:

37

5

5

6


        1.我们先来看第一个输出,由于在arr3[5]这个字符数组中,我们对它进行了完全初始化,在字符数组中不含‘\0’,其在内存中大致这样开辟的:

C语言学习之sizeof与strlen_第1张图片

由于strlen()是在遇到’\0‘才会停止计数,所以当统计到数组最后一个元素时不会停止,而是继续向后进行统计,直到遇到’\0‘,因此37其实是一个随机值

        2.而sizeof()并没有这种限制,输出的结果就即为数组所占的空间大小,因此第2个和第4个输出结果即为arr3[5]和arr4[6]的大小。

        3.然后是strlen(arr4[6]),由于我们对数组进行了不完全初始化,而当我们对数组进行不完全初始化时,其余的空间会自动进行初始化(字符数组初始化为'\0',整形数组初始化为0),我们打开监视窗口查看arr4[6]的数据如下:

C语言学习之sizeof与strlen_第2张图片

可以看出即使我们没有对arr4[5]进行初始化,编译器也会自动将其进行初始化,即'\0'(ASCII码值为0),因此最终输出结果为5。

4.在常量字符串的使用

        在这之前我们需要知道,当我们写出一个字符串常量时,其末尾自动会加上'\0'。

如写出“abcd”,其在内存中应该存放着'a','b','b','d','\0',其中'\0'被隐藏。

#include
#include
int main()
{

	char arr5[] = "hello";
    printf("%d\n",strlen(arr5));
    printf("%d\n",sizeof(arr5));
	return 0;
}

输出结果如下:

5

6


 打开监视窗口可查看arr5[6]的数据如下:

C语言学习之sizeof与strlen_第3张图片

由于字符串“hello”自带'\0',对数组进行初始化时使arr5[5]被赋值为'\0',因此strlen()遇到'\0'停止统计,输出5,而sizeof()则输出所占空间为6。


制作不易,能否点个赞再走呢qwq

你可能感兴趣的:(C语言学习打卡,c语言,学习)