[笔试题]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\n",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\n",sizeof(str));  //  5
    printf("sizeof(str2) = %lu\n",sizeof(str));  //  5
    printf("sizeof(str3) = %lu\n",sizeof(str3));  //  5
    //*str为首元素地址的内容,即是首元素的值
    printf("sizeof(*str) = %lu\n",sizeof(*str));  //  1
    //容易认为是5,但"hello"是字符串,最后一个是‘\0‘
    printf("sizeof(hello) = %lu\n",sizeof("hello"));  //  6
    //str1是数组,保存的是字符串,所以长度为6
    printf("sizeof(str1) = %lu\n",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函数 需要注意的是,这个函数返回的结果不包含\0
    //ASCII码中: 十进制的0 - 字符空格‘ ‘ - 转义字符‘\0‘ - 代码NULL ,所以strlen(str) == 0
    printf("strlen(str) = %lu\n",strlen(str));  //  0  【特别注意】
    printf("strlen(str1) = %lu\n",strlen(str1));  //  5  【特别注意】
    printf("strlen(str2) = %lu\n",strlen(str2));  //  1  【特别注意】  字符‘0‘,对应ASCII码为48
    printf("strlen(str3) = %lu\n",strlen(str3));  //  3  【特别注意】
    printf("strlen(hello) = %lu\n",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\n",sizeof(str1));  //  4*4 = 16
    printf("strlen(str1) = %lu\n",sizeof(str2));  //  4
    printf("strlen(str2) = %lu\n",sizeof(str3));  //  4

    return 0;
}

执行结果如下:

原文地址:https://www.cnblogs.com/linuxAndMcu/p/9864498.html

时间: 2024-11-02 06:22:57

[笔试题]sizeof系列面试题中的易错之处的相关文章

字符串,向量和数组中的易错点

while (cin >> word){ cout << endl; } cin>>word; 在输入Ctrl+Z后,后面的输入就都不能接受到数据了.   在string s:中s.empty();是意味着S为空及s=="";而不能将s=NULL;是错的.   在vector中注意基本是函数的调用.   iterator 中的begin和end,

C#中ListView易错的方法

现在有一个ListView(lv1),有2列. ListViewItem lvi = new ListViewItem(); lvi.Text = "语文"; lvi.SubItems.Add("99"); lvi.Items.Add(lvi); lvi = new ListViewItem(); lvi.Text = "数学"; lvi.SubItems.Add("100"); lvi.Items.Add(lvi); 有同学

C# 四舍五入中一处易错点

,你没看错,四舍五入的结果 和我们期待的不太一样 Why?? 进入源码看下,注释中解释的很清楚.. 默认情况下,Math.Round()方法返回的是最接近的整数,这个没问题,问题是当要转换的数据在 两个整数之间时即 0.5时,这个方法默认会返回两个整数中的偶数,并不是我们认为的0.5就进位 如果我们需要实现四舍五入 我们看它的几个重载方法 其中 这个方法的参数MidpointRounding枚举 参数给出了当数据是两个整数之间的数值时,如果取整数 其中第二个,会舍入较小的那个整数,也就是取较大的

java基础中的易错点

包 包在java中类似于c++命名空间 1.1.如何建立多层包? 传送门 注意: 每个包目录下面的文件,开头的格式都是package bag1.bag2.xxx.xxx...; 表示这个文件在哪个包(目录)里面.不能随意修改和删除这个语句,要不然产生不匹配的错误. 在一个包(目录)下新建一个文件夹,那么这个文件夹就会变成子包. 原文地址:https://www.cnblogs.com/yulianggo/p/10426527.html

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

1 创建对象 在fight方法中想根据接收到的名字创建不同的对象,最后调用方法,其中palnt是一个接口这三种对象已经实现了该接口.但在运行时下面代码是错误的因为我在if中声明了plant其作用范围只在{ }有效,因此后面直接使用是错误的. public void fight(String name){ if ("Bean".equals(name)){ Plant plant = new Bean(); }else if ("Ice".equals(name)){

[Java网络安全系列面试题] 说一说TCP和UDP的区别与联系?

TCP TCP是Transfer Control Protocol(传输控制协议)的简称,是一种面向连接的保证可靠传输的协议. 在TCP/IP协议中,IP层主要负责网络主机的定位,数据传输的路由,由IP地址可以唯一确定Internet上的一台主机. TCP层则提供面向应用的可靠的或非可靠的数据传输机制,这是网络编程的主要对象,一般不需要关心IP层是如何处理数据的. 通过TCP协议传输,得到的是一个顺序的无差错的数据流. 发送方和接收方的成对的两个socket之间必须建立连接,以便在TCP协议的基

JAVA面试题解惑系列(七)——日期和时间的处理

日期和时间的处理不仅在面试题中会考到,在实际项目开发中也是我们经常需要处理的问题,似乎没有哪个项目可以避开它们,我们常常在处理用户的出生年月日.注册日期,订单的创建时间等属性时用到,由此可见其重要性. java.util.Date类 提到日期和时间,我想大家最先想到应该是java.util.Date类吧.Date类可以精确到毫秒数,这个毫秒数是相对于格林威治标准时间"1970-01-01 00:00:00.000 GMT"的差值.那么,什么是格林威治标准时间呢?要回答这个问题,我们需要

剑指offer 面试题(二维数组中的查找) (2)

面试题: 二维数组中的查找 /* 题目:   在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成 一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该数. */ ps:(其实前段时间我就做过这道题,今天看到了,觉得还是有点生,那就再来一次吧) 题目分析:  在分析这个问题的时候,我们首先要看,在一个二维数组中查找一个数字是否存在,那么很多人就觉得 简单了,遍历二维数组与所需要查找的数字进行比较不就完了!  不可否认的是你说的是可行的,可是

【剑指Offer面试题】二维数组中的查找

下决心AC所有剑指offer面试题. 九度OJ面试题地址:http://ac.jobdu.com/hhtproblems.php 书籍:何海涛--<剑指Offer:名企面试官精讲典型编程题> 对于面试题,面试官往往更希望我们能提出优化方法,这样更能体现我们的思维能力以及传说中的"内功".所以做剑指offer要着重训练这方面,多总结多细究,总是有好处的.加油~ 二维数组中的查找 时间限制:1 秒内存限制:32 兆 特殊判题:否提交:19005解决:3642 题目描述: 在一个