strlen和sizeof的陷阱

本文详细解析了C语言中strlen与sizeof函数的用法及区别,通过具体实例展示了如何计算数组、指针和字符串的长度。强调了strlen的风险及其对''的依赖,同时介绍了sizeof在不同类型参数上的表现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、strlen

在C语言中,strlen是一个函数,计算字符串长度,遇见  ' \0 '  停止。如果没有 ' \0 ' 将在内存中一直寻找,直到寻找到了'\0'停止。所以strlen还是存在很大的风险的。而且参数必须是字符型指针(char*)。当数组名作为参数传入时,实际上数组就退化成指针了。所以当函数的参数是数组的时候,不要在函数内部使用strlen,因为这样算的是不是数组的长度,而是一个指针的长度。

2、sizeof

在 C 语言中,sizeof() 是一个判断数据类型或者表达式长度的运算符。在头文件中typedef为unsigned int(size_t),参数可以是数组、指针、类型、对象、函数等。

^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^

上面是strlen和sizeof的概念和使用的注意事项,下面带来一些有趣的代码,帮助理解它们和进一步了解两个的区别

》》》一维数组

//C语言
main(){
int a[] = { 1,2,3,4 };
	printf("%d\n",sizeof(a));//这个就很简单吧,计算的数组的长度,每个元素的长度是4个字节,所以答案是 4 * 4 = 16

	printf("%d\n", sizeof(a+0));//这里计算的什么呢?好像数组名不能加减吧?但是指针可以啊,所以这里指针的长度。因为米钱VS是32位编译系统的。所以是4

	printf("%d\n", sizeof(*a));//这个是解引用吧。所以计算的是第一个元素的长度哇,是 4

	printf("%d\n", sizeof(a[1]));//这个太明显了,不说了不说了,第一个元素的长度 ,是 4

	printf("%d\n", sizeof(&a));//取地址的结果是什么啊?结果是指针呐。取地址,地址是啥,指针。所以是 4

	printf("%d\n", sizeof(*&a));//这里和上面有点相似。加了 * 。便是解引用吧?这是对数组的解引用哦。简单点就是* 和& 抵消,结果是 16

	printf("%d\n", sizeof(&a+1));//这里上面提到过,所以是指针+ 1啊。但还是指针吧。所以是 4

	printf("%d\n", sizeof(&a[0]));//这里是指针吧。所以一班遇见了 &就是指针吧?但是要看编译系统是多少位的。这里是 4。32位的

	system("pause");
}

》》》字符数组

这里看strlen和sizeof的区别哦

//strlen不管参数是指针还是数组名,都会拿着这个地址一直找到'\0'结束.因为退化啊。看前面的概念

注意定义的方式

//C语言
char arr[]={'a','d','g'}//这种是没有'\0'的。

char* arr="adg";//这个是有'\0'的

char arr[]="adg"//这个是有'\0'的

//带有 " " ,都是有'\0'的
//C语言
main(){
char arr[] = { 'a','b','c','d','e','f' };
	printf("%d\n", sizeof(arr));//这还是数组的长度吧?结果就是 6吧

	printf("%d\n", sizeof(arr+0));//还是指针啊,指针才能相加减哦 所以结果是 4

	printf("%d\n", sizeof(*arr));//这是解引用吧?第一个元素的长度 所以是 1

	printf("%d\n", sizeof(arr[1]));//这是第一个元素的长度,简单。是1。字符的长度哦。

	printf("%d\n", sizeof(&arr));//这是指针哦。所以是4

	printf("%d\n", sizeof(&arr+1));//这里上面提到过,还是指针吧。所以是 4

	printf("%d\n", sizeof(&arr[0]+1));//这里注意计算的先后顺序啊。arr[0]->&arr[0]->&arr[0]+1。所以是指针+1 化石指针哦  4

//未定义行为
	printf("%d\n", strlen(arr));//注意strlen要到'\0'结束哦,但这个数组是没有'\0'的,所以啊,是个随机数,我也不知道

	printf("%d\n", strlen(arr + 0));//这个还是一样,不管是撒,只要没有'\0'都是堆积值,这个只和上面的是一样的吧
}

//再提醒!!strlen不管参数是指针还是数组名,都会拿着这个地址一直找到'\0'结束
//C语言
main(){
	char arr[] = "abcdef";//这是有'\0'仅限于字符串的初始化
	printf("%d\n", sizeof(arr));//这还是数组的长度吧?但是多了一个'\0'哦,结果就是 7
	printf("%d\n", sizeof(arr + 0));//还是指针啊,指针才能相加减哦 所以结果是 4
	printf("%d\n", sizeof(*arr));//这是解引用吧?第一个元素的长度 所以是 1
	printf("%d\n", sizeof(arr[1]));//这是第一个元素的长度,简单。是1。字符的长度哦。
	printf("%d\n", sizeof(&arr));//这是指针哦。所以是4
	printf("%d\n", sizeof(&arr + 1));//这里上面提到过,还是指针吧。所以是 4

	printf("============\n");
	printf("%d\n", strlen(arr));//这还是数组的长度吧?但是不包括'\0'。结果就是 6吧
	printf("%d\n", strlen(arr + 0));//这里有'\0',从这里开始计算长度,所以结果是 6
	printf("%d\n", strlen(*arr));//这是解引用吧?但是strlen不能求字符长度。
	printf("%d\n", strlen(arr[1]));//strlen不能求字符长度。
	printf("%d\n", strlen(&arr));//和第二个一样的结果,懂我意思吧?
	printf("%d\n", strlen(&arr + 1));//这个地址是整个数组的地址,跳过就越界了。所以是随机值
	printf("%d\n", strlen(&arr[0] + 1));//这个就简单吧?从第二个元素位置开始找。所以是 5
}
//C语言
main(){
	char* p = "abcdef";
	printf("%d\n", sizeof(p));//这里是个指针啊。所以是4

	printf("%d\n", sizeof(p+1));//这还是4,不说了

	printf("%d\n", sizeof(*p));//这里解引用啊。第一个元素的长度 结果 1

	printf("%d\n", sizeof(p[0]));//第一个元素的长度啊 1

	printf("%d\n", sizeof(&p));//这里是指针吧 4

	printf("%d\n", sizeof(&p+1));//4

	printf("%d\n", strlen(p));//有'\0'  6

	printf("%d\n", strlen(p + 1));//第二个元素开始啊。所以是5

	printf("%d\n", strlen(*p));//未定义行为

	printf("%d\n", strlen(p[0]));//未定义行为

	
}

》》》二维数组

//C语言
main(){

	int a2[3][4] = { 0 };

	printf("%d\n", sizeof(a2));//十二个元素,都是int 型,所以结果是48

	printf("%d\n", sizeof(a2[0]));//这是第一个一维数组的长度,所以结果是16

	printf("%d\n", sizeof(a2[0]+1));//这是指针吧?所以是4

	printf("%d\n", sizeof(*(a2[0]+1)));//==a2[0][1] 所以是4

	printf("%d\n", sizeof(*(&a2[0]+1)));//对数组的解引用,所以是16
}

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值