sizeof()与strlen
说真的,每次笔试,还是说面试,总会喜欢出sizeof()与strlen()这类的题目,这种题目往往会让人头晕目眩,头都大!!!
先给出这两个链接:
https://www.cnblogs.com/danshui/archive/2012/01/02/2310402.html
https://blog.csdn.net/Colorful_lights/article/details/79819682
本人在面试大厂的时候被面试官直接给出几道sizeof()与strlen()题目,虽然之前是有复习过相关的知识点,但是在面试的时候紧张的氛围与现场立马给答案,当时做错了很多,其实还是没有掌握这知识点,只要有一点模糊不确定,offer就不确定了。
答这样的一类问题,首先要确定改系统是多少位的系统!!!面试官给的题目中没有给出,其实做题前要当场问清楚,这也是他们设的陷阱(面试官坏得很)
先给出题目:
char str1[]="my dog"; char *str2="my dog"; int num[]={1,2,3,4,5}; int *p1=num; int *p2=new int[10]; 1.sizeof(str1)=_______? 2.sizeof(str2)=_______? 3.strlen(str1)=_______? 4.strlen(str2)=_______? 5.sizeof(num)=__________? 6.sizeof(p1)=__________? 7.sizeof(p2)=__________?
面试中立马给出答案,你的头会不会晕?(大佬忽略)
我当场问了面试官,他说是32位系统,注意,是32位!
基础知识:
(1)sizeof
<1> sizeof(...)是运算符,在头文件中typedef为unsigned int,其值在编译时即计算好了,参数可以是数组、指针、类型、对象、函数等。
<2> 它的功能是:获得保证能容纳实现所建立的最大对象的字节大小。
<3> 由于在编译时计算,因此sizeof不能用来返回动态分配的内存空间的大小。实际上,用sizeof来返回类型以及静态分配的对象、结构或数组所占的空间,返回值跟对象、结构、数组所存储的内容没有关系。
<4>具体而言,当参数分别如下时,sizeof返回的值表示的含义如下:
数组——编译时分配的数组空间大小;
指针——存储该指针所用的空间大小(存储该指针的地址的长度,是长整型,应该为4);
类型——该类型所占的空间大小;
对象——对象的实际占用空间大小;
函数——函数的返回类型所占的空间大小。函数的返回类型不能是void。
(2)strlen
<1> strlen(...)是函数,要在运行时才能计算。参数必须是字符型指针(char*)。当数组名作为参数传入时,实际上数组就退化成指针了。
<2>它的功能是:返回字符串的长度。该字符串可能是自己定义的,也可能是内存中随机的,该函数实际完成的功能是从代表该字符串的第一个地址开始遍历,直到遇到结束符NULL。返回的长度大小不包括NULL。
这个函数名字前面已经是str开头,这表明着这个函数只能计算字符串的长度
按照上面的知识点,可以知道:
sizeof(str1(字符数组))=7 PS:因为这个是字符串数组,每个字符占1个字节,而且连空字符'\0'也加上去了6+1=7 sizeof(str2(指针))=4 PS:32位系统指针变量占4个字节,所以是4 sizeof(num(整型数组))=20 PS:整型数组中每个元素是int类型,每个元素占4个字节,4*5=20 sizeof(p1(整型指针))=4 PS:无论是整型指针还是字符指针,在32位系统中存储的大小都是一样的4个字节,可以看上面的表 sizeof(p2(整型指针))= 4 PS:其实和上面一样,只是用new迷惑一下面试者 strlen(str1)=6 PS:遇到strlen中规中矩数元素个数就行了,空格也要算。数组名会自动退化成指针 strlen(str2)=6 PS:strlen本来就是就要数据指针进去
附上代码验证:注意我的电脑是64位的,你们懂的
#include <bits/stdc++.h> using namespace std; int main(){ char str1[]="my dog"; char *str2="my dog"; int num[]={1,2,3,4,5}; int *p1=num; int *p2=new int[10]; cout<<"sizeof(str1)="<<sizeof(str1)<<endl; cout<<"sizeof(str2)="<<sizeof(str2)<<endl; cout<<"sizeof(num)="<<sizeof(num)<<endl; cout<<"sizeof(p1)="<<sizeof(p1)<<endl; cout<<"sizeof(p1)="<<sizeof(p2)<<endl; cout<<"strlen(str1)="<<strlen(str1)<<endl; cout<<"strlen(str2)="<<strlen(str2)<<endl; return 0; }