野指针(深入浅出)

C语言基本语法--指针篇(有了它,再也不用担心指针了) 指针,想必不少小伙伴谈其色变吧,在C语言的学习中,年轻的程序员肯定少不了和指针的打交道,对于指针的学习,不少人心生畏惧,听不懂,不会用,成为常见的困惑,因而,本文总结了C语言初阶语法中的所有指针的内容,可以说,有了它,指针再也不是难题了! 阅读详情
 论一

什么是野指针?
  一个母亲有两个小孩(两个指针),一个在厨房,一个在卧室,(属于不同的代码块,其生存期不同)母亲让在厨房的小孩带一块蛋糕(指针指向的对象)给在卧室的小孩,这样在卧室的孩子才肯写作业。但这个在厨房的小孩比较淘气,他在走出厨房时自己将蛋糕吃了,没能带出来。而在卧室的没有吃到蛋糕,所以不肯完成他的作业。结果母亲却不知道卧室的孩子没有吃到蛋糕,还以为作业完了。结果第二天她就被老师召唤到办公室了。事情麻烦了。
  这样,那个在卧室的孩子就是野指针了,因为他没有得到应得的蛋糕,不能完成母亲交给他的作业。
  这就是c中所讲的野指针。上面的小剧本不过演示了一种最基本的野指针的形成过程。更容易出现的情形是coder在编码时,大意之下使用了已经free过的指针。
  对于年轻点的经验欠缺的coder来说是比较容易犯的错误,经验老到的程序员或者慎重采取成对编程的形式避免这种失误,或者使用引用计数器防止形成野指针。
  总之,在c中,野指针也许性子野,但是控制起来也是有章可循。然而事情在c++中出现了变化。
  coder们面临更大的麻烦了。c++程序员无可避免的要写很多这样那样的类。谁让c++是面向对象的呢?
  我们在写类的时候难免要用new给类的数据成员分配内存。这本来没什么,动态分配内存是一种很常见的基本操作,我们在学数据结构时经常这么做,不是么? 
  但是伙计,事情并非这么简单。类是一种高级的用户自定义数据类型,看起来和结构、枚举这样的用户自定义类型没啥太大差别。如果你这样认为....?那你会死的很惨。类太复杂了,普通情况下使用类的对象并没有太大的问题,但是,当你要复制一个对象时,问题就来了。
  比如我们知道,你要用一个对象初始化另一个对象时,c++是按位进行拷贝的,即在目标对象里创建了初始化对象的一个完全相同的拷贝。这在多数情况下已经足够了。但是,当你的类在创建时为每个对象分配内存,也就是说类中有new操作。当你的对象创建好后,类也为对象分配了一块内存。如果你用这个对象去初始化另一个对象时,被初始化的对象和初始化的对象完全一样。这意味着,他们使用同一块内存,而不是重新为被初始化的对象分配内存。
  这样麻烦就大了。如果一个对象销毁了,那么分配的内存也就销毁了(别忘了,类是有析构函数的,它负责在对象销毁时,释放动态分配的内存。难道你说你不在类中写上析构部分?那么可怜的孩子,那你就走向了另一个深渊,当你的程序运行数小时之后,系统会告诉你,内存不够用了。想象一下把你的程序用在腾讯的服务器上),另一个对象就残缺不全了,这就像一对连体婴儿,他们共用了一部分器官,心脏或者肝脏。要救活一个,就牺牲了另一个。一个得病了,另一个也要遭殃。
  可以说,这就是c++中更加变态的野指针。
  什么?你说我不用对象初始化对象?那么我们会不会将一个对象作为变元传递给函数呢?我们很多时候都这样做。有时我们不得不将对象按值传递给一个函数,但是你要知道,按值传递是什么意思?它的意思就是,把实参的一个拷贝传递给函数。这和刚才的初始化没什么两样,按位拷贝,函数体内的对象与外面的对象共用一块内存,即便在函数中的对象没有对这块内存进行过操作,但是当函数结束时。。。。析构函数将会被调用......
  还有一种与之相反的情况......, 当你想要把一个在函数内的对象值返回给外面的对象时,这时候,会自动产生一个临时对象,由它容纳函数的返回值,并在函数结束时把结果传给目标。那么这个临时对象迅速的被创建,并被迅速的释放。。。一块内存被释放了两次。其后果是不可预见的。 
  当你把一个对象的值赋给另一个对象时,如果你没有重载赋值运算符,那么也会导致按位拷贝。最终产生一个野指针(一个隐藏在类内的毒瘤),或者释放同一块内存多次。 
  看到了么?害怕了么?是不是感到C++到处都是陷阱呢?不但有陷阱,到处都是危险品。所有c中的疑难问题,到了c++就成了一般问题了。好了不废话了,我们继续讲讲解决之道。
  对于最后的这种赋值的情况,我们只有通过重载赋值运算符才能解决,也就是避免按位拷贝。
  至于前面的都属于初始化,概括下来就是三种情况:
  1.当一个对象初始化另一个对象时,例如在声明中;
  2.把所创建的对象拷贝(按值)传递给一个函数时;
  3.生成临时对象时,最常见的就是函数的返回值。
  解决初始化时的按位拷贝问题,我们通过创建拷贝构造函数来解决。
  基本的拷贝构造函数形式为:
classname (const classname &o)
{
//body here
}
  拷贝构造函数就是针对这个问题而设计的。

讨论二

    野指针,也就是指向不可用内存区域的指针。通常对这种指针进行操作的话,将会使程序发生不可预知的错误。 
    “野指针”不是NULL指针,是指向“垃圾”内存的指针。人们一般不会错用NULL指针,因为用if语句很容易判断。但是“野指针”是很危险的,if语句对它不起作用。野指针的成因主要有两种: 
    (1)、指针变量没有被初始化。任何指针变量刚被创建时不会自动成为NULL指针,它的缺省值是随机的,它会乱指一气。所以,指针变量在创建的同时应当被初始化,要么将指针设置为NULL,要么让它指向合法的内存。 
    (2)、指针p被free或者delete之后,没有置为NULL,让人误以为p是个合法的指针。别看free和delete的名字恶狠狠的(尤其是delete),它们只是把指针所指的内存给释放掉,但并没有把指针本身干掉。通常会用语句if (p != NULL)进行防错处理。很遗憾,此时if语句起不到防错作用,因为即便p不是NULL指针,它也不指向合法的内存块。例: 
char *p = (char *) malloc(100); 
strcpy(p, “hello”); 
free(p); // p 所指的内存被释放,但是p所指的地址仍然不变 
if(p != NULL) // 没有起到防错作用 
strcpy(p, “world”); // 出错 
    另外一个要注意的问题:不要返回指向栈内存的指针或引用,因为栈内存在函数结束时会被释放。

    首先请诸位看以下一段“危险”的C++代码: 
void function( void ) 
{
char* str = new char[100];
delete[] str;
// Do something
strcpy( str, "Dangerous!!" );
}
    之所以说其危险,是因为这是一段完全合乎语法的代码,编译的时候完美得一点错误也不会有,然而当运行到strcpy一句的时候,问题就会出现,因为在这之前,str的空间已经被delete掉了,所以strcpy当然不会成功。对于这种类似的情况,在林锐博士的书中有过介绍,称其为“野指针”。 
    那么,诸位有没有见过安全的“野指针”呢?下面请看我的一段C++程序,灵感来自优快云上的一次讨论。在此,我只需要C++的“类”,C++的其余一概不需要,因此我没有使用任何的C++标准库,连输出都是用printf完成的。 
#include <stdio.h> 
class CTestClass 
{
public:
CTestClass( void );
int m_nInteger;
void Function( void );
};
CTestClass::CTestClass( void ) 
{
m_nInteger = 0;
}
void CTestClass::Function( void ) 
{
printf( "This is a test function.\n" );
}
void main( void ) 
{
CTestClass* p = new CTestClass;
delete p;
p->Function();
}
   OK,程序到此为止,诸位可以编译运行一下看看结果如何。你也许会惊异地发现:没有任何的出错信息,屏幕上竟然乖乖地出现了这么一行字符串: 
This is a test function. 
    奇怪吗?不要急,还有更奇怪的呢,你可以把主函数中加上一句更不可理喻的: 
((CTestClass*)NULL)->Function(); 
    这仍然没有问题!! 
    我这还有呢,哈哈。现在你在主函数中这么写,倘说上一句不可理喻,那么以下可以叫做无法无天了: 
int i = 888; 
CTestClass* p2 = (CTestClass*)&i;
p2->Function();
    你看到了什么?是的,“This is a test function.”如约而至,没有任何的错误。 
    你也许要问为什么,但是在我解答你之前,请你在主函数中加入如下代码: 
printf( "%d, %d", sizeof( CTestClass ), sizeof( int ) ); 
    这时你就会看到真相了:输出结果是——得到的两个十进制数相等。对,由sizeof得到的CTestClass的大小其实就是它的成员m_nInteger的大小。亦即是说,对于CTestClass的一个实例化的对象(设为a)而言,只有a.m_nInteger是属于a这个对象的,而a.Function()却是属于CTestClass这个类的。所以以上看似危险的操作其实都是可行且无误的。
    现在你明白为什么我的“野指针”是安全的了,那么以下我所列出的,就是在什么情况下,我的“野指针”不安全: 
    (1)在成员函数Function中对成员变量m_nInteger进行操作; 
    (2)将成员函数Function声明为虚函数(virtual)。 
    以上的两种情况,目的就是强迫野指针使用属于自己的东西导致不安全,比如第一种情况中操作本身的m_nInteger,第二种情况中变为虚函数的Function成为了属于对象的函数(这一点可以从sizeof看出来)。 
    其实,安全的野指针在实际的程序设计中是几乎毫无用处的。我写这一篇文章,意图并不是像孔乙己一样去琢磨回字有几种写法,而是想通过这个小例子向诸位写明白C++的对象实例化本质,希望大家不但要明白what和how,更要明白why。李马二零零三年二月二十日作于自宅。 
    关于成员函数CTestClass::Function的补充说明 :
    (1)这个函数是一个普通的成员函数,它在编译器的处理下,会成为类似如下的代码: 
void Function( const CTestClass * this ) // ① 
{
printf("This is a test function.\n");
}
    那么p->Function();一句将被编译器解释为: 
Function( p ); 
    这就是说,普通的成员函数必须经由一个对象来调用(经由this指针激活②)。那么由上例的delete之后,p指针将会指向一个无效的地址,然而p本身是一个有效的变量,因此编译能够通过。并且在编译通过之后,由于CTestClass::Function的函数体内并未对这个传入的this指针进行任何的操作,所以在这里,“野指针”便成了一个看似安全的东西。
    然而若这样改写CTestClass::Function: 
void CTestClass::Function( void ) 
{
m_nInteger = 0;
}
    那么它将会被编译器解释为: 
void Function( const CTestClass * this ) 
{
this->m_nInteger = 0;
}
    你看到了,在p->Function();的时候,系统将会尝试在传入的这个无效地址中寻找m_nInteger成员并将其赋值为0,剩下的我不用说了——非法操作出现了。 
    至于virtual虚函数,如果在类定义之中将CTestClass声明为虚函数: 
class CTestClass 
{
public:
// ...
virtual void Function( void );
};
    那么C++在构建CTestClass类的对象模型时,将会为之分配一个虚函数表vptr(可以从sizeof看出来)。vptr是一个指针,它指向一个函数指针的数组,数组中的成员即是在CTestClass中声明的所有虚函数。在调用虚函数的时候,必须经由这个vptr,这也就是为什么虚函数较之普通成员函数要消耗一些成本的缘故。以本例而言,p->Function();一句将被编译器解释为: 
(*p->vptr[1])( p ); // 调用vptr表中索引号为1的函数(即Function)③ 
    上面的代码已经说明了,如果p指向一个无效的地址,那么必然会有非法操作。 
备注: 
①关于函数的命名,我采用了原名而没有变化。事实上编译器为了避免函数重载造成的重名情况,会对函数的名字进行处理,使之成为独一无二的名称。 
②将成员函数声明为static,可以使成员函数不经由this指针便可调用。
③vptr表中,索引号0为类的type_info。

讨论三:

先上代码,传说中的腾讯笔试题:
#include 'stdafx.h'  
#include <iostream>
#include <string>
using std::cout;
using std::endl;
class Test
{
public:
Test()
{
a = 9;
delete this;
}
~Test()
{
cout<<'destructor called!'<<endl;
}
int a;
};

int _tmain(int argc, _TCHAR* argv[])
{
Test *mytest = new Test(); //mytest的值和this指针的值是一样一样的
cout<<mytest->a<<endl;
return 0;
}
请问运行结果如何?
    常见的回答,程序会报错,通不过编译。或者说编译通过,运行时报错,因为居然Test类的构造函数删除了this指针,相当于调用了Test类的析构函数,对象不再存在,所以访问成员变量a的时候出错。
    实际的结果是,程序可以通过编译,运行时不报错,只不过打印出a的值不是9,而是内存中一个随机垃圾值。
    如果想让程序运行时出错,可以这样写main函数:
Test mytest;
cout<<mytest.a<<endl;
return 0;
    这样mytest是局部对象,内存在栈上分配,delete this试图释放栈上的内存,因此会报错。
    下面的代码演示了这种情况。
int a = 6;
delete &a; //运行时报错
    继续上面的讨论,野指针是指在delete了一个指向动态对象的指针后,没有及时置为NULL,如果对该指针进行解除引用,就会产生垃圾值。
    一个铁的纪律,彻底杜绝野指针(这道题没办法,this不能做左值,况且即使改了this,mytest也是改不了的,不再考虑范围)delete了一个指向动态对象的指针后,及时置为NULL。相应的,对指针进行解除引用前,判断指针是否为NULL。

 
C语言第十七课:初阶指针 在前面的三篇文章中,我和各位小伙伴们一起细致的学习了各种常用操作符的用法、属性以及各种常见的错误等等相关知识点。在掌握了操作符的相关使用后,本文我们将要一起学习关于指针的新知识。 阅读详情

相关推荐

国密SSL实战:手把手教你用Wireshark抓包分析GMTLS协议(附证书链验证技巧)

本文提供了一份国密SSL(GMTLS)协议的实战抓包分析指南。通过详细讲解Wireshark的配置、GMTLS握手流程的捕获与筛选,以及双证书机制和证书链的深度解析,帮助工程师和开发人员掌握使用Wireshark排查国密SSL连接问题、进行密评和协议调试的核心技巧。

rgv234567的博客 502

野指针

讨论一 什么是野指针?  一个母亲有两个小孩(两个指针),一个在厨房,一个在卧室,(属于不同的代码块,其生存期不同)母亲让在厨房的小孩带一块蛋糕(指针指向的对象)给在卧室的小孩,这样在卧室的孩子才肯写作业。但这个在厨房的小孩比较淘气,他在走出厨房时自己将蛋糕吃了,没能带出来。而在卧室的没有吃到蛋糕,所以不肯完成他的作业。结果母亲却不知道卧室的孩子没有吃到蛋糕,还以为作业完了。结果第二天她就被老师...

weixin_34235457的博客 250

基于Termux的Android平台OpenClaw部署:移动端AI助理实现

本文介绍了在Android设备上通过Termux部署OpenClaw AI助理的方案。Android设备的便携性、Termux提供的完整Linux环境以及多样化的硬件配置使其成为理想的部署平台。文章详细分析了不同级别Android设备的硬件规格(从入门级到旗舰级),并提供了最低/推荐配置要求。部署步骤包括Termux安装初始化、Python环境配置以及性能优化建议。该方案充分利用Android设备的传感器和电池供电优势,为移动办公、学习等场景提供了低成本、高便携性的AI助理解决方案。

博客 3011

野指针——奇妙比喻(编恋爱小故事)

野指针|指针初始化|指针越界|指针指向空间释放,及时置NULL |避免返回局部变量的地址 |指针使用之前检查有效性

Ham_m的博客 536

selenium绕过检测,规避检测

现在不少大网站有对selenium采取了监测机制。比如正常情况下我们用浏览器访问淘宝等网站的 window.navigator.webdriver的值为 undefined或者为false。而使用selenium访问则该值为true。那么如何解决这个问题呢?我们正常浏览器登录查看,window.navigator.webdriver的值为false我们通过selenium打开的网页,测试,可见window.navigator.webdriver的值为true。

景天科技苑 1万+

13、超声断层乳腺图像融合算法:乳腺癌诊断新突破

本文介绍了一种新型超声断层乳腺图像融合算法,通过结合超声透射(UTTc、UTTα)和反射断层图像(URT),实现对乳腺组织的多参数自动可视化。该算法能有效区分良性与恶性肿瘤,具有高准确性、无辐射、低成本等优势,适用于大规模乳腺癌早期筛查。初步临床测试验证了其可行性,未来有望成为乳腺癌诊断的新标准。

9q8w7e6r5的博客 154

学习笔记:C语言的指针的学习——野指针

平时我们写的指针都是一级指针。int a=10;int* pa=&a;//pa就是一级指针变量,int*就是一级指针类型a是一个变量,将a的地址取出来,放进pa里面,pa的类型是int*。pa是一级指针变量。再来想一下,pa是指针变量,变量创建要在内存中开辟空间。如果现在这样写:&pa,就拿到了pa空间的地址。这块地址也想存起来,怎么办呢?比如将pa的地址,存放进ppa变量里面,这时候ppa的类型就应该这样写:int**。ppa就是二级指针(存放一级指针的地址)。

Liu1013216383的博客 3245

Android Update Engine 分析(三四)OTA 签名都支持哪些算法?

写了几十篇还没涉及到 OTA 签名算法细节,OTA 讨论群也很少问这个,毕竟签名算法纯理论的问题,一旦实现好就极少需要改动,只需要进行一些配置,准备好签名的秘钥和证书就可以了。限于签名的算法理论太过于抽象,本篇不讨论签名算法细节,但会总结一些签名操作。以及 Android OTA 包支持的签名算法。本文主要分析 Update Engine 中支持的签名算法,以及这些算法的操作实现(不涉及原理部分),并总结签名和验签使用的 key。

洛奇看世界 715

野指针及指针的简单运算

野指针、指针运算

Good_go的博客 323

五步通关!宝塔Linux部署ASP.NET Core的魔法秘籍大公开!

摘要: 本文提供ASP.NET Core应用五步部署攻略,涵盖从环境配置到线上运行的完整流程: 1️⃣ 环境准备:安装宝塔面板、ASP.NET Core运行时及开放端口; 2️⃣ 应用发布:通过dotnet publish生成独立部署包并上传服务器; 3️⃣ Nginx配置:设置反向代理将域名请求转发至应用端口; 4️⃣ 进程守护:使用Supervisor确保应用持续运行; 5️⃣ HTTPS加密:通过宝塔快速申请SSL证书并解决验证路径冲突。 关键点: 强调权限设置(755)、端口开放及反向代理细节; 提

java专栏 969

【python股票价格预测】基于LSTM(长短期记忆网络)的股票价格预测(附python代码)

【python股票价格预测】基于LSTM(长短期记忆网络)的股票价格预测(附python代码)

k8291121的博客 1012

指针之野指针系列(1):什么是野指针

指针之野指针系列

weixin_64308540的博客 560

Xilinx系ZYNQ学习笔记(一)Vivado使用说明

vivado使用学习

贾saisai的博客 1873

【C语言】玩转指针——关于指针,你需要掌握的基础知识!

文章目录前言一、指针是什么?1.数据在内存中的存储2.一个小的单元到底是多大?二、指针变量1.什么是指针变量2.指针类型3.指针类型的作用三、野指针1.什么是野指针2.野指针成因2.1. 指针未初始化2.2指针越界访问2.3指针指向的空间释放3.如何规避野指针四、指针运算1.指针+-整数2.指针-指针五、指针和数组1.数组元素的指针2.通过指针引用数组元素六、二级指针七、指针数组最后 前言 指针是C语言中的一个重要概念。正确而灵活的运用指针,可以使程序间接、紧凑、高效。每一个学习和使用C语言的人,都应当.

weixin_46913665的博客 2万+

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

初阶指针——全面了解指针(全)

对C语言初阶指针的全面了解

诺诺的包包 1382

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

3.2.小心野指针

什么是野指针?通过一段代码来体会一下。#include<stdio.h>int main(void) { int * p ; *p = 314; printf("*p = %d\n",*p); }看看打印的值是多少?是314吗?程序运行出错了,为什么?回想一下局部变量的特点:1.分配在栈上,2.若未初始化,其值为垃圾值。这里的指针变量 p 也是局部变量,p为经初始化,p保留的

寒风1999 502

关于C/C++/Objective-C的野指针

什么是野指针?先来看看一个场景。 一个母亲有两个小孩(两个指针),一个在厨房,一个在卧室,(属于不同的代码块,其生存期不同)母亲让在厨房的小孩带一块蛋糕(指针指向的对象)给在卧室的小孩,这样在卧室的孩子才肯写作业。但这个在厨房的小孩比较淘气,他在走出厨房时自己将蛋糕吃了,没能带出来。而在卧室的没有吃到蛋糕,所以不肯完成他的作业。结果母亲却不知道卧室的孩子没有吃到蛋糕...

weixin_30466039的博客 134

指针与指针变量的区别(C语言)

提示:本章主要谈及个人对C语言指针和指针变量的理解 文章目录前言一、指针是什么?二、指针变量是什么?三、知识拓展总结 前言 指针是C语言中的一个很重要的concept,掌握指针的应用,可以使程序更加简洁、紧凑和高效。可以说,没有掌握指针就是没有掌握C语言的精华。 提示:以下是本篇文章正文内容,下面案例可供参考 一、指针是什么? 通过学习C语言我们知道,在定义变量的时候,系统会自动给该变量分配内存空间。编译系统根据程序中定义的变量类型,分配一定长度的空间。 思考这样一个问题: 要怎么才能知道系统分配给.

weixin_48627356的博客 7149

【C语言】你还不会指针吗?不妨来一起攻克指针这个难点

本篇文章给大家介绍了C语言初阶中的一大难点,指针方面的各种知识点,让处于新手阶段的你更容易理解指针,在以后的日子里对指针的应用如鱼得水,更加透彻

你我皆为凡人的博客 5335

指针存储、指针变量运算及野指针二级指针知识详解

指针存储、指针变量类型、野指针、二级指针、指针数组

weixin_46465199的博客 638

【C语言】超详讲解☀️指针是个什么针?(一次性搞定指针问题)

目录 前言 什么是指针? 引例 计算机是怎么对内存单元编号的呢? 内存空间的地址如何得到 想存地址怎么办? ​ 本质目的不是为了存地址 指针和指针类型 前言 指针这一部分可能很多人在学习的时候都觉得很难,但在这里我想说的是:不要自己吓自己,想一想,你当初刚上大学的时候可能觉得高数非常难,最后学完整本书的时候回过头再看还觉得很难吗? 肯定已经觉得没有刚开始学那么难了,那么其实指针也是这样的,只要把里面的东西都搞清楚,你就不觉得难了。 一、 什么是...

weixin_46531416的博客 5202

【指针】 空(NULL)指针和野指针 指针与数组 多级指针 字符串与指针 函数参数使用指针

【指针】 空(NULL)指针和野指针 指针与数组 多级指针 字符串与指针 函数参数使用指针

weixin_73221039的博客 1027

C语言指针初阶--详解

文章目录定义指针和指针类型指针语法野指针常见导致野指针的情况指针运算指针和数组数组中正确使用指针二级指针指针数组 定义 指针实质上就是一个变量,是用来存放另一个变量的地址,就像其他变量或常量一样,必须在使用指针存储其他变量地址之前,对其进行声明。 举实例来理解指针: 指针必须结合内存来理解! 把内存想象成很长很长的大走廊,走廊上有很多很多房间,每个房间的大小都是一个字节。每个房间都有一个门牌号,门牌号是从0开始,依次递增,房间号就叫“地址”,可以用另外的一块内存空间来保存这个地址,这样的内存空间就称之为“指

一朵花花 3261

【C语言航路】第六站:指针初阶

主要详细讲解了指针与内存对于他们理解,指针和指针类型,指针类型的意义,野指针的成因,以及如何规避野指针,指针的三种运算,指针与数组的关系,二级指针,以及指针数组

青色_忘川的博客 3520

[ 转]野指针,以及c++中的野指针

摘自justrun2005的blog什么是野指针?  一个母亲有两个小孩(两个指针),一个在厨房,一个在卧室,(属于不同的代码块,其生存期不同)母亲让在厨房的小孩带一块蛋糕(指针指向的对象)给在卧室 的小孩,这样在卧室的孩子才肯写作业。但这个在厨房的小孩比较淘气,他在走出厨房时自己将蛋糕吃了,没能带出来。而在卧室的没有吃到蛋糕,所以不肯完成他 的作业。结果母亲却不知道卧室的孩子没有吃到蛋糕

scuhaibo的专栏 1116
上一篇: 定时器和多线程的不同
下一篇: STL,ATL,WTL之间的联系和区别
雪岢奇
博客等级 码龄17年 310粉丝 60原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值