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;
}

图片说明

全部评论

相关推荐

M_bao:换个排版吧哥们,看着费劲
点赞 评论 收藏
分享
评论
点赞
1
分享
牛客网
牛客企业服务