[笔试题]sizeof系列面试题中的易错之处

Posted linuxandmcu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[笔试题]sizeof系列面试题中的易错之处相关的知识,希望对你有一定的参考价值。

sizeof系列笔试题看似简单,其实如果不深入探究,很容易出错,本人就有时败在了这,特写篇博客总结一番,引以为戒。

V1.0 32位和64位编译器的区别

测试代码如下:

#include "stdafx.h"
#include <iostream>
using namespace std;

int main()
{
    //32和64位编译器区别: 除了*与long随操作系统子长变化而变化外,其他的都固定不变(32位和64相比)
    //32: sizeof(*)=4 sizeof(long)=4
    //64: sizeof(*)=8 sizeof(long)=8
    //这里为32位编译器
    cout << "bool size = " << sizeof(bool) << endl; //1
    cout << "char size = " << sizeof(char) << endl; //1
    //--
    cout << "wchar_t size = " << sizeof(wchar_t) << endl; //=unsigned short 2
    cout << "short size = " << sizeof(short) << endl; // 2 short=2!=int
    cout << "int size = " << sizeof(int) << endl;   //4
    cout << "long size = " << sizeof(long) << endl; //4    [long=int=4 为32位编译器]
    cout << "long long size = " << sizeof(long long) << endl;   //8
    cout << "char*=" << sizeof(char*) << " int*=" << sizeof(int*) << endl; // 4 [*=4 为32位编译器]
    //--
    cout << "float size = " << sizeof(float) << endl; //4
    cout << "double size = " << sizeof(double) << endl; //8
    cout << "long double size = " << sizeof(long double) << endl;   //8 【注意】

    return 0;
}

执行结果如下:
技术分享图片

V2.0 sizeof字符数组

测试代码如下:

#include "stdafx.h"
#include <iostream>
using namespace std;

void printSize(char aInFunc[])
{
    printf("sizeof(aInFunc) = %lu
",sizeof(aInFunc));
}

int main()
{
    char str[5] = {0};
    char str1[] = "hello";
    char str2[5] = {‘0‘};
    char str3[5] = {‘0‘,‘0‘,‘0‘};

    //str为含有5个元素的数组(后面会自动填充空格‘ ‘),数组名代表首元素的地址,所以sizeof(str)代表整个数组所占的内存空间
    //容易误认为传的是地址,判断为4,但实际上你传的是数组名,数组名不等价于地址
    printf("sizeof(str) = %lu
",sizeof(str));  //  5
    printf("sizeof(str2) = %lu
",sizeof(str));  //  5
    printf("sizeof(str3) = %lu
",sizeof(str3));  //  5
    //*str为首元素地址的内容,即是首元素的值
    printf("sizeof(*str) = %lu
",sizeof(*str));  //  1
    //容易认为是5,但"hello"是字符串,最后一个是‘‘
    printf("sizeof(hello) = %lu
",sizeof("hello"));  //  6
    //str1是数组,保存的是字符串,所以长度为6
    printf("sizeof(str1) = %lu
",sizeof(str1));  //  6
    //在数组作为参数传入的时候实际上就退化为普通的指针了,不过这个指针实际上类似于const pointer
    printSize(str); // 4

    return 0;
}

执行结果如下:
技术分享图片

V3.0 strlen字符数组

#include "stdafx.h"
#include <iostream>
using namespace std;

int main()
{
    char str[5] = {0};
    char str1[] = "hello";
    char str2[5] = {‘0‘};
    char str3[5] = {‘0‘,‘0‘,‘0‘};

    //strlen函数 需要注意的是,这个函数返回的结果不包含
    //ASCII码中: 十进制的0 - 字符空格‘ ‘ - 转义字符‘‘ - 代码NULL ,所以strlen(str) == 0
    printf("strlen(str) = %lu
",strlen(str));  //  0  【特别注意】
    printf("strlen(str1) = %lu
",strlen(str1));  //  5  【特别注意】
    printf("strlen(str2) = %lu
",strlen(str2));  //  1  【特别注意】  字符‘0‘,对应ASCII码为48
    printf("strlen(str3) = %lu
",strlen(str3));  //  3  【特别注意】
    printf("strlen(hello) = %lu
",strlen("hello"));  //  5

    return 0;
}

执行结果如下:
技术分享图片

V4.0 sizeof数组指针/指针数组

#include "stdafx.h"
#include <iostream>
using namespace std;

int main()
{
    //VS为32位编译器
    char **str1[4]; //str是指针数组,数组包含4个指向指针的指针(**)
    char *(*str2)[4]; //str是数组指针,指向包含4个指针的char*数组
    char (**str3)[4]; //str是数组指针,指向包含4个char的char数组

    printf("strlen(str) = %lu
",sizeof(str1));  //  4*4 = 16 
    printf("strlen(str1) = %lu
",sizeof(str2));  //  4
    printf("strlen(str2) = %lu
",sizeof(str3));  //  4

    return 0;
}

执行结果如下:
技术分享图片





以上是关于[笔试题]sizeof系列面试题中的易错之处的主要内容,如果未能解决你的问题,请参考以下文章

C语言进阶刷题笔记strlen和sizeof经典笔试题

C语言进阶刷题笔记strlen和sizeof经典笔试题

手把手带你刷LeetCode——20.一道笔试题

Java代码实际应用中的易错点记录

java笔试题(面试题)系列之一

JS的易错代码