[笔试题]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系列面试题中的易错之处的主要内容,如果未能解决你的问题,请参考以下文章