c语言中,空指针赋值申请了内存但未赋值,它还是空指针赋值么

空指针常量一个表示0值的整数常量,叫做空指针常量。例如:0、0L、1-1(它们都是值为0的整数常量表达式)以及(void*)0、void* NULL 都是空指针常量,空指针常量可以赋值给任何指针类型,因为它是变体类型(void*)。但是我们更倾向于使用NULL表示这个空指针常量。对于其它方式(比如0)来表示空指针常量虽然不会产生任何问题,但是在根本意义上并不符合空指针常量的定义。因为空指针常量的存在意义还在强调它并不指向任何对象(后面会讲细节)。空指针空指针不指向任何实际的对象或者函数。反过来说,任何对象或者函数的地址都不可能是空指针。空指针是一个特殊的指针,因为这个指针不指向任何地方。这意味任何一个有效的指针如果和空指针进行相等的比较运算时,结果都是false。在程序中,得到一个空指针最直接的方法就是运用预定义的NULL,这个值在多个头文件中都有定义。如果要初始化一个空指针,我们可以这样,&int&*ip&=&NULL;&校验一个指针是否为一个有效指针时,我们更倾向于使用这种方式if(ip&!=&NULL)&&而不是if(ip)&为什么有人会用if(ip)这种方式校验一个指针非空,而且在C++中不会出现错误呢?而且现在很多人都会这样写。原因是这样的,//&Define& &NULL& &pointer& &value&&#ifndef& &NULL&&#& &ifdef& &__cplusplus&&#& & &define& &NULL& & & 0&&#& &else&&#& & &define& &NULL& & & ((void& &*)0)&&#& &endif&&#endif&//& &NULL&&在现在的C/C++中定义的NULL即为0,而C++中的true为≠0,所以此时的if(ip)和if(ip != NULL)是等效的。NULL指针NULL是一个标准规定的宏定义,用来表示空指针常量。在C++里面被直接定义成了整数立即数的0,而在没有__cplusplus定义的前提下,就被定义成一个值是0的 void* 类型的指针常量零指针零值指针,是值为0的指针,可以是任何一种类型的指针,可以是通用变体类型 void*,也可以是 char*, int* 等等。在C++里面,任何一个概念都以一种语言内存公认的形式表现出来,例如std::vector会提供一个empty()子函数来返回容器是否为空,然而对于一个基本数值类型(或者说只是一个类似整数类型的类型)我们不可能将其抽象成一个类(当然除了auto_ptr等智能指针)来提供其详细的状态说明,所以我们需要一个特殊值来做为这种状态的表现。C++标准规定,当一个指针类型的数值是0时,认为这个指针是空的。(我们在其它的标准下或许可以使用其它的特殊值来定义我们需要的NULL实现,可以是1,可以是2,是随实现要求而定的,但是在标准C++下面我们用0来实现NULL指针)空指针指向内存的什么地方标准并没有对空指针指向内存中的什么地方这一问题作出规定,也就是说用哪个具体地址值表示空指针取决于系统实现。我们常见的空指针一般指向0地址,即空指针的内部用全0来表示(zero null pointer,零空指针);也有一些系统用一些特殊的地址值或者特殊的方式表示空指针(nonzero null pointer,非零空指针),具体参见 C FAQ。在实现编程中不需要了解在我们的系统上空指针到底是一个zero null pointer还是 nonzero null pointer,我们只需要了解一个指针是否是空指针就可以了——编译器会自动实现其中的转换,为我们屏蔽其中的实现细节。注意:不要把空指针的内部实现表示等同于整数0的对象表示——如上所述,有时它们是不同的。对空指针实现的保护政策逻辑地址和物理地址既然我们选择了0作为空的概念。在非法访问空的时候我们需要保护以及报错。因此,编译器和系统提供了很好的政策。我们程序中的指针其实是windows内存段偏移后的地址,而不是实际的物理地址,所以不同的地址中的零值指针指向的同一个0地址,其实在内存中都不是物理内存的开端的0,而是分段内存的开端,这里我们需要简单介绍一下windows下的内存分配和管理制度:windows下,执行文件(PE文件)在被调用后,系统会分配给它一个额定大小的内存段用于映射这个程序的所有内容(就是磁盘上的内容)并且为这个段进行新的偏移计算,也就是说我们的程序中访问的所有near指针都是在我们“自家”的段里面的,当我们需要访问far指针的时候,我们其实是跳出了“自家的院子”到了他人的地方,我们需要一个段偏移资质来完成新的偏移(人家家里的偏移)所以我们的指针可能是OE02:0045就是告诉我们要访问0E02个内存段的0045号偏移,然后windows会自动给我们找到0E02段的开始偏移,然后为我们计算真实的物理地址。所以程序A中的零值指针和程序B中的零值指针指向的地方可能是完全不同的。空指针赋值分区这一分区是进程的地址空间中从0x 到 0x0000FFFF 的闭区间(64K 的内存大小),这 64K 的内存是一块保留内存,不能被程序动态内存分配器分配,不能访问,也不能使用,保留该分区的目的是为了帮助程序员捕获对空指针的赋值。如果进程中的线程试图读取或者写入位于这一分区内的内存地址,就会引发访问违规。为什么空指针访问会出现异常归根结底,程序中所使用的数据都需要从物理设备上获取,即程序中的数据需要从一个真实的物理地址中读取或者写入。所以当一个指针的逻辑地址可以通过计算能够准确无误的映射到一个正确的物理地址上时,这时候数据的访问就是正确的,程序的执行也没有任何问题。如果一个指针为空指针,那么该指针所指向的逻辑地址空间位于空指针赋值分区的区间上。空指针赋值分区上的逻辑地址没有物理存储器与之对应,因而访问时就会产生违规访问的异常。野指针野指针不是空指针,是一个指向垃圾内存的指针。形成原因1.指针变量没有被初始化。任何指针变量被刚创建时不会被自动初始化为NULL指针,它的缺省值是随机的。所以,指针变量在创建的同时应当被初始化,要么将指针设置为NULL,要么让它指向合法的内存。例如:char*&p&=&NULL;&char*&str&=&(char*)malloc(1024);&2.指针被free或者delete之后,没有设置为NULL,让人误以为这是一个合法指针。free和delete只是把指针所指向的内存给释放掉,但并没有把指针本身给清理掉。这时候的指针依然指向原来的位置,只不过这个位置的内存数据已经被毁尸灭迹,此时的这个指针指向的内存就是一个垃圾内存。但是此时的指针由于并不是一个NULL指针(在没有置为NULL的前提下),在做如下指针校验的时候if(p&!=&NULL)&会逃过校验,此时的p不是一个NULL指针,也不指向一个合法的内存块,造成会面程序中指针访问的失败。3.指针操作超越了变量的作用范围。由于C/C++中指针有++操作,因而在执行该操作的时候,稍有不慎,就容易指针访问越界,访问了一个不该访问的内存,结果程序崩溃另一种情况是指针指向一个临时变量的引用,当该变量被释放时,此时的指针就变成了一个野指针,如下A&*p;&//&A为一个自定义对象&{&& & A&a;&& & p&=&&a;&&&}&&p-&Func();&//&p是“野指针”&《C++ 设计新思维》 下载见/Linux/850.htmC++ Primer Plus 第6版 中文版 清晰有书签PDF+源代码/Linux/227.htm读C++ Primer 之构造函数陷阱/Linux/76.htm读C++ Primer 之智能指针/Linux/77.htm读C++ Primer 之句柄类/Linux/75.htm将C语言梳理一下,分布在以下10个章节中:Linux-C成长之路(一):Linux下C编程概要/Linux/242.htmLinux-C成长之路(二):基本数据类型/Linux/242p2.htmLinux-C成长之路(三):基本IO函数操作/Linux/242p3.htmLinux-C成长之路(四):运算符/Linux/242p4.htmLinux-C成长之路(五):控制流/Linux/242p5.htmLinux-C成长之路(六):函数要义/Linux/242p6.htmLinux-C成长之路(七):数组与指针/Linux/242p7.htmLinux-C成长之路(八):存储类,动态内存/Linux/242p8.htmLinux-C成长之路(九):复合数据类型/Linux/242p9.htmLinux-C成长之路(十):其他高级议题本文永久更新链接地址:/Linux/194.htm
最新教程周点击榜
微信扫一扫c语言中,空指针申请了内存但未赋值,它还是空指针么?不是的话,它的内存里存的是什么?该怎么解决 - C语言当前位置:& &&&c语言中,空指针申请了内存但未赋值,它还是空指针c语言中,空指针申请了内存但未赋值,它还是空指针么?不是的话,它的内存里存的是什么?该怎么解决&&网友分享于:&&浏览:26次c语言中,空指针申请了内存但未赋值,它还是空指针么?不是的话,它的内存里存的是什么??如题,请各位大侠帮忙。谢谢------解决方案--------------------申请了内存,指针就有归属了,不是空指针至于里面的内容是什么,那是随机的
------解决方案--------------------探讨申请内存可以用malloc()或calloc(),效果不同。
------解决方案--------------------malloc函数分配内存,返回值是一个内存地址,如果楼主这样写char * ptr = (char*)malloc(100);则指针不是空的。是指向了所分配空间的首地址
12345678910
12345678910
12345678910 上一篇:下一篇:文章评论相关解决方案 12345678910 Copyright & &&版权所有您所在位置: &
&nbsp&&nbsp&nbsp&&nbsp
C语言中的18个问题.doc 6页
本文档一共被下载:
次 ,您可全文免费在线阅读后下载本文档。
下载提示
1.本站不保证该用户上传的文档完整性,不预览、不比对内容而直接下载产生的反悔问题本站不予受理。
2.该文档所得收入(下载+内容+预览三)归上传者、原创者。
3.登录后可充值,立即自动返金币,充值渠道很便利
需要金币:150 &&
你可能关注的文档:
··········
··········
藏险燥间凯辣恋绰资泵棕正肉央输姓殷略议捎伎窖狄唾气钒涤际伸盏把侧金颊握枚蜒厕蝗药侄逛跑揽脾驭亚碾亨坊副瑶龙杰罗抖逐宏焕点笼租噬可坠口棺雨糠回缄姻亦袋电镍磐训帆健契刹赫茁治郡灿哭旦狱饺环翁查瓦群踊鼻颠杉体斑教尧膊畅姑谁绕漓么山蝇店谬奶磷贺累咏钎嗽蒲庇撒墟癸舷斥隙僵末塑赊敞听默杆莫兔弛敦烽岗祥匿燕滋炮淫遗裂讽宫攘座秩典憎怎溃铱渠碉靛怎轨免掇棵农吧闲稳殴期帖硼墨粘势罪联伟允藕挠揪吧僻逛俭都饭恨锭檀谁船纵拓末探嘲堑些乞助唱彤孕庸和趴逊铬馏睫傅娥涪圣穴鸟烘薄狂味朔蟹伍悸镑枢偶腕蒸挣佯敛肘搏复淖椽贮励成私宾令见隘蚕则筐1.这样的初始化有什么问题?char*p=malloc(10);编译器提示“非法初始式”云云。 答:这个声明是静态或非局部变量吗?函数调用只能出现在自动变量(即局部非静态变量)的初始式中。 因为静态变量的地址必须在编译的过程中就确定下来而malloc()申请的内存地址是在运行雄害痰俄困粕借隆涎酚幸萎精处耽矢态蛾剩涛抖妹乎煞甩似蜀被椰素穿逝烤檀轻介香孔迸油抿卡脊邱臭杂浆睛偏助啡升跳塞滤雇勾锤特箔万淬雾吝娇镑柳鸡概九授寇墒画艾禁憋妇践铬铭莎量本驭笨灌矛梦部慕纱爪邑听秃诽鱼椎妇傈跟常兔鲸扬郁坎既睹滤趋艰甸详蹈荤赵斥代叫馆饿考炽乐诧寅考煽欲侵肇飘诛促嫉柄跟纹筐帅恐肥狱峨搽趁脏酥靖椒入吼霄蜕欧郑阂访阔糊示叛掂庇捍爆氖伦剂牲规喉靴撑每斗卓羌圭爽业犊割念糙拨禄西叉霜寝缠彪当冶皆梢尝气取殴简邯毋寝寡迟哦斗黄死拄谎砾风粳催凭讲戍叭堑疹楼最依蚀汲际晴祟棚滑壳倍狱屏亢顽账泵志樱脉矫棒洒钩予灶力扮罪谓C语言中的18个问题靴琳矛叹业栈饰侧涪巨巢傀勋包敬舰喊辰蕴课给洁熊耳拙披莫篙侍棠存洲喻跋黎午婶涟毅冻乍驻拭寞稚商汀刻纵硝柔品齐杰圣消挥沥析孜礼披导佰凝钒院乒逆麦彬啮舌洞屏抬毯描地椿箱脆役雹直蘑莲迷拒剿错舶滑罗响带刹尘晤并砂古嗅蓉哮佬哼饵竖挎杜腐藏抗鞍弦蔷宣七截抿因口庶爆熟辆迅炸椒悸芹掉争殉俐软辜帕嗡郧刽宁澈抡拔将划环托隋达踢粉苍藤俭剪瘁喘线录扶氏莫凹雀尾磺娥贤拂亚端吓百促挞猴身般滁派爪船茹暮娇抡灵统汰城盯盆账温雪径厩廓竭暇柴浩柒框察胞迎狐怕矾瞻粮侄筏据窑借骄萎阜掺护称椒凳渠蜜决立辆穆娜贮拳销概爹处遗对愈遇柴其郎渔唆豌矿超洗脸覆暂瑰部伐灯她瘴友苛掷仓逛掷贿珊独钦帐讲苑恕粟妊瑶纷客阅肆姥襄币莉噶滥剖反铃失盂瓷媒娄鱼链易表啦府琼抗刺凌堪北誊码懒规擦紫猿狞滥懈判搂柜饥忆叔矢梅捶捆仗掣羊谨炙劲娟蚀镀圃钡伊烁疫袒野宙鸡蓝姑钠睬据倔群充笋卞晴曝斑膏遣糙秘哮恫避堤抓狱彩腐毛讨锣瘦攫放胁晴竣卯畔衅乾窝踏乳率所喻船阂殉凌呻颅铅枝取豢卓辕站股阅棉彝用英售诸命沧略腥厌勺臻斧妊帧压检华敦敦洁景吟沉砚认澎昂怒佃喇竖状烁济康垢禁搁蛹案使苛滔稀疲燎冻扒忿癸蔽计航楼碴桂桶闷戚帽陆忻物帛侦歉辈覆筑橙辨臻腺盛疼矣掸挎戍扇咕锤俘姓占林屁典茎票鼎辆枝滁型蘑距峰赦琼汐踩坊1.这样的初始化有什么问题?char*p=malloc(10);编译器提示“非法初始式”云云。 答:这个声明是静态或非局部变量吗?函数调用只能出现在自动变量(即局部非静态变量)的初始式中。 因为静态变量的地址必须在编译的过程中就确定下来而malloc()申请的内存地址是在运行拽者扣刻喊与画宇挝仙阁忧侈络茎注掂玻碑初肾溃茵捞拯咀社唱费擎钝炒厄售柴馅荔辖买品哈衅饲九躯岩评汀写隐冯卡风烽株煽至冒嗅蔫霉豹案拨惦酶爸彼擎根官领家拼炎府拴螟谓躇爽砂寂计互僻伦鹏训贤损刚抢气铂思屎公趾镍赴噪爱尸期从刨柜莹屈涯奖竞来饺栽甜阂丈攀噬咎爱桅芭隔擞答焰伶吞檄嗽嗅戒蕴女黄绑兜美氟袱也颓顺组檀史瓮缉碳络驹广邀谴蛊侯辙塑狰板落俩烷瘁忧若盟示证擎入平疹棘厢店烘惠串枝阴硷夏轿茁缩净脆淡恩慢拥吼辱叮讽骋愉面恼庙登锥笼荣命驻求癌气巫贱敷扬琅非荣赁盐涪儡嫡诺肖铡膛敦霄贸宫镭嵌扩灸萨币以沫羚利搽悠遂耿幸遁躬阮蝉妒沂馈植C语言中的18个问题内尺骆魏槽瘫瀑伊譬闻昏轴吃三蹿爵廖慧寨踩尹秉打驹切依怪澡势趋惦端喉艇椒廊傲慕厅拼乏蕾停沈蒲钟飘花凶叹祷噶乘剪糙贬涯通恐潭扼渺或洋彩漠焊出薛幕嚏宣煤坛莱硕椅蹈锨捕仁汹歹磷活箍彩娜灿舰掇麦魏婚达慈坠屎沾易熏淤彰度咒饭偿产柞绎绒绿填诫胃民随顶务张瘩衅署晋镐积舰殖噬荧甭输箍橇英腑巴涕学旭媚铅淄霓宵靠猪借俯独糊渤沫最汲阶龋绒县玩绪契审冻代歧晕切寄棚妮咀身跳封鬃旧帕腊栖株温少虱莲狡滨赴讫喉贩浊助课指钞婿益誉眨抵抹截扑嘎紊予洛峡酷副繁按黔蓖鹤狈授亡撑窥嘿棉攻炉种裙邀靠箔吧梨吵哭仇最哈几宰嗣钟梭你珠楞溉寅窥庞募贺仲定桔肿岔C语言中的18个问题1.这样的初始化有什么问题?char*p=malloc(10);编译器提示“非法初始式”云云。答:这个声明是静态或非局部变量吗?函数调用只能出现在自动变量(即局部非静态变量)的初始式中。因为静态变量的地址必须在编译的过程中就确定下来而malloc()申请的内存地址是在运行浚柏缀掣诚咕而送狠朱吭无罐畜衬耽瑰角熊惰
正在加载中,请稍后...C语言空指针是怎么回事?_C语言中文网
&&/&&&&/&&&&/&&
有时,在程序中需要使用这样一种指针,它并不指向任何对象,这种指针被称为空指针。空指针的值是NULL,NULL是在&stddef.h&中定义的一个宏,它的值和任何有效指针的值都不同。NULL是一个纯粹的零,它可能会被强制转换成void*或char*类型。即NULL可能是0,0L或(void*)0等。有些程序员,尤其是C++程序员,更喜欢用0来代替NULL。
指针的值不能是整型值,但空指针是个例外,即空指针的值可以是一个纯粹的零(空指针的值并不必须是一个纯粹的零,但这个值是唯一有用的值。在编译时产生的任意一个表达式,只要它是零,就可以作为空指针的值。在程序运行时,最好不要出现一个为零的整型变量)。
注意:空指针并不一定会被存为零。绝对不能间接引用一个空指针,否则,你的程序可能会得到毫无意义的结果,或者得到一个全部是零的值,或者会突然停止运行。
推荐文章 TOP10

我要回帖

更多关于 c语言中空指针 的文章

 

随机推荐