帮打一张小票打印机怎么装纸纸,拍照过来给我就可以

空指针(NULL)不能用吗? - 推酷
空指针(NULL)不能用吗?
我们常常被告知,使用指针前需要判断是否为
而你去使用它就会出问题。真相果真是这样吗?
同事颜廷帅(微博:@颜挺帅)给我看以下一个程序,问我,这段程序执行后,有问题吗?
#include&iostream&
#include&cstdlib&
using namespace std;
class Test1
cout&&&Test1: Core or not ? &&&endl;
int main()
Test1 *p = NULL;
p-&f();//会core吗?会出大事吗?
是一个空指针,通过这个空指针,我们访问了函数
,没问题,成功输出了
Test1: Core or not ?
发生了什么事?空指针也能用?
如果我们把
稍作修改,程序其他地方不做任何变动:
cout&&&Test1: Core or not ? &&&a&&//access a
那么程序运行后分分钟
有没有感觉了?嗯,相信有了。我们继续往下看:
#include&iostream&
#include&cstdlib&
using namespace std;
static int global = 1;
class Test2
cout&&&Test1: Core or not ? &&&global&&endl;//access global
int main()
Test2 *p = NULL;
p-&f();//会core吗?会出大事吗?
也没问题。
嗯,你可能已经知道了真相。通过空指针访问东西,只要那个东西是确实存在的,就不会有问题。
怎么理解“确实存在”?它是一个实体,看得见,摸得着。
程序中对象的内存布局。
中,成员函数、静态变量是独立于对象存放的;而普通的数据成员是和对象相关的。
Test1 obj1;
Test1 obj2;
是共用函数
是相同的,内存中只有一份实体;而
有自己的实体
然而,注意到
Test1 *p = NULL;
仅仅是声明式,而非定义式。这时候,没有定义任何的对象出来,通过
呢?哪来的
在内存里并不存在。因此,访问
呢?它是独立于对象存放的,自然没问题。一般说来,
位于程序的代码段,而全局变量一般位于
段(这个比较复杂,和该全局变量是否初始化以及初始化为
有关)。而当我们定义对象时,才为该对象分配内存,才有数据成员
#include&iostream&
#include&cstdlib&
using namespace std;
static int global1 = 1; //DATA段
static int global2; //BSS段
class Test3
cout&&&Test1: Core or not ? &&&endl;
Test3 obj3; //DATA段 (调用默认构造函数进行初始化)
int main()
Test3 obj1; //stack段。定义obj1,这时候自然为a分配内存了
Test3 *obj2 = new Test3();//heap段,也为a分配内存了。
Test3 *p;//只是声明,没有定义。没有对象,也没有a。
受王杰兄(微博:@skyline09_)启发和提示,其实我们可以换一种形式来理解。
我们知道,
中,类的非静态成员函数会被编译器改写:
void Test::f()
被改写为类似于
void Test__f(Test *const this)
Test *p = NULL;
将被编译器改写为
Test *p = NULL;
Test__f(p);
中带有一个值为
),如果通过这个空指针
读写数据,就会崩溃。否则,安然无事。
指针可以操纵哪些东西呢?哦,类的非静态数据成员。而类的静态数据成员,全局变量等,是不会通过
指针访问的,因此,上例中,访问
崩溃,访问
最后,我们看一个问题。这个问题,最早我是从杜克伟兄(微博:@小伙伴-小伙伴儿)那里听到的。
class Test4
cout&&&(*this)&&endl; // 有问题吗?
int main()
Test4 *p = NULL;
相等。因此上面会输出
综上,使用空指针并不一定会发生问题,关键是怎么用。遇到问题得理性分析,不要想当然。
纸上学来终觉浅,绝知此事要躬行。
已发表评论数()
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
主题不准确
没有分页内容
图片无法显示
视频无法显示
与原文不一致欢迎加入我们,一同切磋技术。 &
用户名: &&&
密 码: &
共有 914 人关注过本帖
标题:C语言中对某指针变量未进行初始化和对他以NULL处理有什么区别
等 级:新手上路
帖 子:152
结帖率:25%
&&问题点数:0&&回复次数:6&&&
C语言中对某指针变量未进行初始化和对他以NULL处理有什么区别
搜索更多相关主题的帖子:
来 自:曼哈顿
等 级:贵宾
威 望:32
帖 子:1737
专家分:5952
同等高手讲解
那一年,苍井空还是处女
来 自:神界
等 级:贵宾
威 望:351
帖 子:11881
专家分:46802
怕你乱用 引起程序崩溃
DO IT YOURSELF !
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
定义的时候初始化不是必须的 但这样做能降低出错的概率 所以是一种好的编程习惯 有些地方就要求定义就初始化
指针初始化为NULL 也算是个好习惯罢 大家都这么做
等 级:新手上路
帖 子:152
好像未赋值输出的是垃圾值i,而NULL后输出程序崩溃?
等 级:业余侠客
帖 子:62
专家分:213
回复 楼主 msl12
避免出现使用野指针 造成程序崩溃。
等 级:贵宾
威 望:304
帖 子:25793
专家分:48814
未初始化,指针的值是随机的,即它可以乱指;而初始化为NULL,则內存管理器会按照约定认为这个指针没指向具体的位置,不会引用它的对象。
授人以渔,不授人以鱼。
版权所有,并保留所有权利。
Powered by , Processed in 0.054322 second(s), 8 queries.
Copyright&, BCCN.NET, All Rights Reserved

我要回帖

更多关于 小票打印机怎么装纸 的文章

 

随机推荐