关于“烫烫烫烫烫烫烫”的程序员笑话

news2024/11/27 8:42:48

环境

  • Microsoft Visual Studio Community 2022
  • Windows 11 家庭中文版

笑话

小明在超市买了3瓶汽水,他先打开第0瓶汽水,咕咚咕咚喝光了,接着打开第1瓶汽水,又咕咚咕咚喝光了,然后又打开第2瓶汽水,咕咚咕咚喝光了,然后又打开第3瓶汽水,刚喝了一口,突然喊道:“烫烫烫烫烫烫烫!”

解释

在Visual Studio中,未分配的内存空间,其初始值用 0xCC (1个字节)填充,而查询编码表可知, 0xCCCC (2个字节)代表字符

如果转换为10进制,比如int数值,int是4个字节,也就是说,把 0xCCCCCCCC (4个字节)转换为10进制,其值是 -858993460

在该笑话中,小明买了3瓶汽水,假设使用的是数组,那么能访问的数组下标为0、1、2,如果访问下标3,显然越界了。

在C语言中,对字符串的处理,稍不注意,就很容易出现越界的情况,而且编译和运行可能都不会报错,所以要格外小心。具体来讲,字符串是以 \0 结尾的,也就是说,在访问字符串的时候, \0 相当于一个哨兵,找到这里,就知道字符串结束了,否则会一直找下去,产生不可预知的结果。

测试

准备

在Visual Studio中创建一个新项目,选择 Empty Project

在这里插入图片描述
右键单击Source Files,Add -> New Items… ,创建 Test0527.cpp 文件:

在这里插入图片描述

测试1

打开 Test0527.cpp 文件,编辑如下:

#include <iostream>

using namespace std;

int main() {
	char str[4];

	str[0] = 'a';
	str[1] = 'b';
	str[2] = 'c';
	str[3] = 0;

	cout << str << endl;
}

这是正确的用法,要想使用字符数组来存储字符串 abc ,数组长度应该是4而不是3,最后一个元素 str[3] 要填入 \0 ,表示字符串结束。

运行程序,结果如下:

在这里插入图片描述

测试2

如果忘了最后需要一个 \0 ,而把字符数组的长度设置为3,则在打印 str 时,依次访问到 abc 之后,并不会结束,而是会继续访问下去。如果接下来是未分配的内存空间,即 0xCCCCCCCCCCCCCCCCCCCCCCCC... ,就会出现 烫烫烫... 的字样。

修改程序如下:

#include <iostream>

using namespace std;

int main() {
	char str[3];

	str[0] = 'a';
	str[1] = 'b';
	str[2] = 'c';
	
	cout << str << endl;
}

运行程序,结果如下:

在这里插入图片描述

注:本例中,数组可以直接初始化:

char str[3] = {'a', 'b', 'c'};

要想查看其int值,可以用一个int指针指向未初始化的元素,比如 str[3] (注:编译器会发现此处越界,可以使用 str + 3 指针):

	int* p = (int*)(str + 3);
	cout << *p << endl;

其输出结果为 -858993460

测试3

实际上,静态分配的内存,如果没有初始化,其初始值也是 0xCC

修改程序如下:

#include <iostream>

using namespace std;

int main() {
	char str[3];
	
	cout << str << endl;
}

运行程序,结果如下:

在这里插入图片描述

其它

动态分配且未初始化的内存

对于动态分配的内存,如果没有初始化,其初始值是 0xCD ,转换为中文字符为 0xCDCD ),其4字节( 0xCDCDCDCD )对应的int值为 -842150451

编辑程序如下:

#include <iostream>

using namespace std;

int main() {
	char* p = new char[100];
	
	p[0] = 'a';
	p[1] = 'b';
	p[2] = 'c';

	cout << p << endl;

	delete[] p;
}

运行程序,结果如下:

在这里插入图片描述

要想查看其int值,可以用一个int指针指向未初始化的元素,比如 p[3]

	int* p2 = (int*)(p + 3);
	cout << *p2 << endl;

其输出结果为 -842150451

动态分配且已释放的内存

一块动态分配的内存,在释放掉之后,系统会用 0xDD 来填充。此时,如果又去访问它,则转换为中文字符为 0xDDDD ),其4字节( 0xDDDDDDDD )对应的int值为 -572662307

编辑程序如下:

#include <iostream>

using namespace std;

int main() {
	char* p = new char[100];

	char* p2 = p;

	delete[] p;

	cout << p2 << endl;
}

运行程序,结果如下:

在这里插入图片描述

要想查看其int值,可以用一个int指针指向 p (在释放 p 之前),或者指向 p2

	int* p3 = (int*)p2;
	cout << *p3 << endl;

上述代码放在 p 释放之后,其输出结果为 -572662307

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/577726.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

运维实用脚本整理

运维实用脚本整理 Linux运维日常巡检脚本系统指标巡检脚本日常命令性能相关的命令进程相关的命令javadump.sh 常用工具一键部署安装常用lib库安装系统检查脚本SPN 日常巡查脚本ffmpeg脚本打开进程&#xff0c;并判断进程数量关闭进程 java jar包启动-剔除Pom中依赖Java jar包通…

SAP QM 检验批上的‘容器数’

近期遇到一个问题。项目上质量部门发现某个原料批次收货打印出来的样品标签数不对。经查发现收货后触发的检验批上的‘容器数’&#xff08;No.Containers&#xff09;为999&#xff0c;实际上此次收货的箱数有1500多。 对于栏位‘容器数’&#xff0c;SAP的官方帮助文档&#…

指针 --- C语言

目录 1.指针是什么 2.指针和指针类型 3.野指针 4.指针运算 5.指针和数组 6.二级指针 7.指针数组 1.指针是什么 为了更好地管理内存&#xff0c;把内存分为了1个个小小的内存单元&#xff0c;大小是一个字节&#xff0c;每个字节给一个编号&#xff0c;内存的编号就是地…

《Spring Guides系列学习》guide56 - guide60

要想全面快速学习Spring的内容&#xff0c;最好的方法肯定是先去Spring官网去查阅文档&#xff0c;在Spring官网中找到了适合新手了解的官网Guides&#xff0c;一共68篇&#xff0c;打算全部过一遍&#xff0c;能尽量全面的了解Spring框架的每个特性和功能。 接着上篇看过的gu…

Entity Framework Core 简明教程(3)- 关系处理

在数据库层面&#xff0c;表之间关系&#xff0c;通过主键、外键来实现&#xff0c;基于约束 (constraint) 和数据完整性来制约。 在 EF Core 技术层面&#xff0c;并不是简单地与数据库这些关系和约束对应&#xff0c;EF Core 有它自己的机制。本篇介绍 EF core 在处理表关系方…

HTML+CSS实训——Day03——仿网易云音乐的发现页界面

仓库链接:https://github.com/MengFanjun020906/HTML_SX 一些今天需要用到的知识点 弹性盒子 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedg…

二次元的登录界面

今天还是继续坚持写博客&#xff0c;然后今天给大家带来比较具有二次元风格的登录界面&#xff0c;也只是用html和css来写的&#xff0c;大家可以来看看&#xff01; 个人名片&#xff1a; &#x1f60a;作者简介&#xff1a;一名大一在校生&#xff0c;web前端开发专业 &…

[acwing周赛复盘] 第 105 场周赛20230527

[acwing周赛复盘] 第 105 场周赛20230527 总结5029. 极值数量1. 题目描述2. 思路分析3. 代码实现 5030. 核心元素1. 题目描述2. 思路分析3. 代码实现 5031. 矩阵扩张1. 题目描述2. 思路分析3. 代码实现 六、参考链接 总结 又是笨比的一周&#xff0c;只做出1题。T1 模拟T2 计…

leetcode刷题之链表相关问题(js)

21.合并两个有序链表 var mergeTwoLists function(list1, list2) {if(list1null) return list2if(list2null) return list1let newHead new ListNode(0,null) //创建一个虚拟节点let cur newHeadlet cur1 list1,cur2 list2while(cur1&&cur2){if(cur1.val<cur2.…

PowerToys Windows 工具集

Microsoft PowerToys | Microsoft Learn Microsoft PowerToys&#xff1a;用于自定义 Windows 的实用工具 项目2023/04/1918 个参与者 反馈 Microsoft PowerToys 是一组实用工具&#xff0c;可帮助高级用户调整和简化其 Windows 体验&#xff0c;从而提高工作效率。 安装 …

Unity之效应器

主要作用&#xff1a;在一个区域内让游戏对象受到力和扭矩力的作用 1、创建一个精灵&#xff08;绿色区域&#xff09; 2、为其添加碰撞器&#xff08;要将Used By Effector和is Trigger打钩&#xff09; 3、添加效应器组件 4、区域效应器参数 Use Collider Mask&#xff1a;…

第3章 Class and Object

构造函数 Guaranteed initialization with the constructor使用构造函数保证初始化 • If a class has a constructor, the compiler automatically calls that constructor at the point an object is created, before client programmers can get their hands on the o…

Solidity基础五

暂时的一事无成也代表将来万事皆有可能&#xff01; 目录 一、对Solidity文件的理解 二、Solidity的导sol文件&#xff08;库、合约&#xff09; 三、Solidity的继承 1.继承的分类 2.继承的可见性 3.父合约构造函数的传参 4.调用父合约成员 5.重写 四、Solidity的抽象…

Solidity基础八

别慌&#xff0c;月亮也在大海某处迷茫 目录 一、Solidity 编程风格 1. 代码布局 2. 代码中各部分的顺序 3. 命名约定 二、Solidity 智能合约编写过程 1. solidity Hello World 2. 版本声明 3. 导入声明 4. 合约声明 三、Solidity 合约结构 智能合约 Test 四、So…

Solidity基础六

生活本来就是平凡琐碎的&#xff0c;哪有那么多惊天动地的大事&#xff0c;快乐的秘诀就是不管对大事小事都要保持热情 目录 一、Solidity的特殊变量(全局) 二、Solidity的不可变量 immutable的赋值方式 三、Solidity的事件与日志 事件和日志加深理解 四、Solidity的异常…

EMLP2021 | Google大模型微调经典论文prompt tuning

一、概述 title&#xff1a;The Power of Scale for Parameter-Efficient Prompt Tuning 论文地址&#xff1a;https://arxiv.org/abs/2104.08691 代码&#xff1a;GitHub - google-research/prompt-tuning: Original Implementation of Prompt Tuning from Lester, et al, …

系列一、RuoYi前后端分离(登录密码加密)

一、部署前后端服务 http://doc.ruoyi.vip/ruoyi-vue/ 二、现象 若依前后端环境分离版本&#xff0c;本地部署好前后端环境后&#xff0c;访问登录接口密码是明文的&#xff0c;这样显然hi不安全的&#xff0c;如下图所示&#xff1a; 三、解决方法 3.1、加密流程 ①、后端…

Linux-0.11 文件系统namei.c详解

Linux-0.11 文件系统namei.c详解 模块简介 namei.c是整个linux-0.11版本的内核中最长的函数&#xff0c;总长度为700行。其核心是namei函数&#xff0c;即根据文件路径寻找对应的i节点。 除此以外&#xff0c;该模块还包含一些创建目录&#xff0c;删除目录&#xff0c;创建目…

Day2:Windows网络编程-TCP

今天开始进入Windows网络编程的学习&#xff0c;在学习的时候总是陷入Windows复杂的参数&#xff0c;纠结于这些。从老师的讲解中&#xff0c;这些内容属于是定式&#xff0c;主要学习写的逻辑。给自己提个醒&#xff0c;要把精力放在正确的位置&#xff0c;不要无端耗费精力。…

【JavaScript】文件分片上传

文章目录 普通文件上传分片上传整体流程技术点分析文件选择方式隐藏input框&#xff0c;自定义trigger拖拽上传 分片动态分片 计算哈希workerrequestIdleCallback抽样 请求并发控制进度展示手动中止/暂停 合并流式并发合并 反思分片命名问题并发控制代码实现的问题 参考文献 普…