嵌入式软件工程师笔试面试题分类汇总——sizeof()、strlen()代码举例

no code you say j8 ! 超详细!!!
今天的话题是老生常谈的sizeof()和strlen(),这俩憨憨玩意其实很简单,刷题的时候经常会遇到,在此做一些总结,
sizeof()
sizeof()求的是占据内存的大小(此处我们假设在32位系统上)

strlen()
strlen()求的是实际长度

说多了也没啥用,直接上代码看区别,冲就完事了!!!

case 1:

#include <stdio.h>
int main()
{
	char str[] = "hello";	//或者可以写成 char str[] = {"hello"};
	char *p = "hello";
	printf("%d\n%d\n", sizeof(str), sizeof(p));
/*
	输出6,4;
	前者求的是数组所占空间的大小,在这种定义方式下,系统会在字符串的末尾自动加上'\0',结果为6;
	后者实际上求的是p这个指针的大小,在32位系统上,对其求sizeof()结果是4;
*/
}

case 2:

#include <stdio.h>
int main()
{
	char str1[] = "hello"; 
 	char str2[] = {'h','e','l','l','o'};
 	printf("%d\n%d\n", sizeof(str1), sizeof(str2));
/*
	输出6,5;
	前者同上;
	后者在这种定义方式下系统是不会自动在字符串末尾添加结束符'\0'
*/
}

case 3:

#include <stdio.h>
int Getsize(int data[])
{
	return sizeof(data);
}
int main()
{
	int data1[] = {1,2,3,4,5};
	int size1 = sizeof(data1);
	
	int *data2 = data1;
	int size2 = sizeof(data2);

	int size3 = Getsize(data1);
	 
	printf("%d\n%d\n%d\n", size1, size2, size3);
/*
	输出20,4,4
	1.data1是个数组,sizeof(data1)求的是数组大小,该数组包含5个整数,每个整数占4个字节,
	  因此共20个字节;
	2.data2声明为指针,尽管他指向了数组data1的第一个数字,但他的本质任然是一个指针,
	  在32位系统上对任意指针求sizeof结果均为4;
	3.在C/C++中,当数组作为函数的参数进行传递时,数组就自动退化为同类型的指针
	  因此size3的结果任然为4;
*/
}
  

case 4:

#include <stdio.h>
#include <string.h>
int main()
{	
	char str[] = "hello"; 
	printf("%d\n%d\n", sizeof(str), strlen(str));
/*
	输出6,5;
	sizeof()不再赘述;
	strlen(str),返回str的长度,但不记'\0'在内
*/
}

case 5:

#include <stdio.h>
int main()
{
	char str[10] = "hello"; 	//注:sizeof(str) == 10, strlen(str) == 5;
	char str[10] = "0123456789";	//错错错!!!
/*
	出错原因:
	在明确字符串大小时,需要给字符串预留1个空位来存放'\0',所以在定义长度为10的字符串
	时,最多只能初始化9个位置,最后一个用来存放'\0';
*/	
}

常见问题总结如上,如有错误,还望指正!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值