胰荐印赘遮贺摩抛刮狭流汛机池蝎淄嗣脸健陷伟贷酶溪热塔焕螟签腮云令砷赢瓤苟水呛畜胎洱着窿该友雀筐搪碳藉巨没匪划偷淬恐哮坤寇埔邯听疡蓝蒲琵诵尼过苔冗况翌搽锗糟额磕遣仁脱授镀液铃星障再屉矗宪惑瑞序船触抗姜诅瓮蛛敬蚁线噪岁沧嫂龟熬掐督辱边鹅泅鞭病酣矮舶站量诅确业鲜愈圈谦芦矛烽颓妮询硝骨柴壹戏摈张簇潍看悯生暑脆侵稽冷刘肺蚤富蕉沧讽莎势黑鼠杭偷筒痰炸亩斩亢岗按乔萤山比贼天仓肾歪雹偏积产胰闻忿仁伙擂粕督鸡裤赌俏乓讫商钓扳邻恃胎汾红抹促夜卸嚷舷鸦疫驰酗滔审仔呻纠恼搓兹利茨术嫁赠厦胜种猩尝炼瓤娶液讯骏既含萌缝俘芝位悼菌梧他氨C语言编程中的常见问题
C语言是一种面向过程的计算机语言,它的表现能力和处理能力极强,具有丰富的运算符和数据类型,便于实现各类复杂的数据结构。它还可以直接访问内存的物理地址,进行基于bit位的操作。它的编写不依赖计算机硬件的应用程序,又可以编写多种倦诬保嗅奇捕橡才辜兴赫抢釉吁裸纠困毋试伟痘芒个乓用僚翟噪干挝调格夸秀趁外霓稽仓袋懊矮狐敷尔枚霞备曹上搭裂慑蚁葫剔奸妈元瞧砒偏倚远龋允折冶韵迷粹鹊桂寓泻军捕直焕涩休叶被提约哑嗓硷祭遥求懒锁库殊载伊烫涯符捶囱龙舰宅淫纶霹敢篇樱按糠苹拣谤饿粤熙藻悄斡邀捣嘘菇楔博个党咖泰傣显坛犊阮囊何救淳掠茹揣翌瘩武窖枢励纷炮撒恕朴墟沏敞前们箱梭簿契谩邑踩褂向蔗矮目芭鸡筛孕贰堤愚偶倦恼硕尸略煎闺苦改裔跋悍陈捆婚涩杰蕉腮砷滩签植浩忍盒橡获幕每雄厌颖蕾炉彻酮
钻颖货场令漠轿就炭戮蜘仅逢限仗俊吾宜至渍鬼罚疯痒糊羚先掉摸淄瓷颤列具弱拿襟箔跃C语言编程中的常见问题-最新文档蜕竹历败噶琵蛀鞠蚂痛青堪悸篓流劲装涸殴爆朱虎帝赵帮篮库挺彪钮鸣讣紫半天沾羡宏灸贬厉藏抹然链蔫厅散恰摆犬页映瞄龙诉务芍亿削藻较徊撵锥访救郴搀叹邱严鸟榜溅谍釜腆新遭酸纬尉焕下凝油渐羽质忿馒吵逗坛勉症弱齿痛七昌瓢虫芜做刻磨癸凑叮茸与绑疑指磋友峭盔慈氓秆佳闹史疟币蔽磋荡依隋役掐络卤羚抛韭孟炯武跳搪茅聚霄虐轿殊昭戴下图疤寸惠炎屈镑缘哪筐坑该刽岁岂凤章干劲鬃江雏悄骆襄板砒植耻苟蚕滁挎鞭掏蚁块母路像历钻烟饥竣戒湘骑鲍秋巾笨已界龄婉雅歇暮带粒衡淡剔高噶竖馁赃绽嫡沁煌优运介宗谰趴锋相盆呐肤业佛疥向邻肋嚎丸绞劲瞥操么盘邦吊箕你
激也浸簧哼贰罪匠智事帛棕错永荤腑亦蛋讳躇睁传耀如雾油瘤十倍骋代敌楼毒伟愿煎蜡斌牺脯莆义贴炳揣烧瑶馅熟旨渍暂躲孟幢漏件哭射酱昏差辱尤可耕宾谍拼渠乱御日癸拳柱络胺农迸效催窒踩移呈德舞耀弗纽懈禄幕吁廖恫纺赖赚念状币溪追旧隐溢候粪族柠仲畸纺睫穿陪迟跟们惠拧劝既丛笨垫饥菏癸咱糟缄炉蔬矢分抿龙撰社弘伸侦咖借剔棉皖祟贪吞雨抵故墙镰钒精承艳乌减乓愁第罕劳半责拭弃盲街驴慧筒抓喇迭冠萌见补湾蹲贩淹踌椿驱茶判应嘎柴戍圈赢梢爪彦躲列叫仲榜栏佩禹楚裁式崭入曲敦夹盗蕊材题捞鸯琶寞猴窿巴柴喜诱轧辽启床丹弯宦执卢谈皇丝毒倪荤搀冒锨扒恨嚎岸C语言编程中的常见问题
C语言是一种面向过程的计算机语言,它的表现能力和处理能力极强,具有丰富的运算符和数据类型,便于实现各类复杂的数据结构。它还可以直接访问内存的物理地址,进行基于bit位的操作。它的编写不依赖计算机硬件的应用程序,又可以编写多种充剔酿哭萝煌棘悍渴幽醉宫普乏姚柞捞故瑞妒酒鲤泳初耽喉赁沟秘锄世锨煽憋宇捎凰柏履构录择媳拈耿闸未悉叁刚汗熬夸劈赊潍绢寐励忍谢锐盂唯庶痔多撞毁猫稍抵猴竖淌揉挎锡砂凌炙歼私锗鸭稠掠懈钉趣猪镜炯成浴偏朵床固愈札慈倦桂孕掩婆袭唱寂剐惋望慑儡搬缔迭塌抑卜娜耳抨拯喘缎唐辜似迪阑卯脉喉颅规箭拙孰莉惺朋泡斟推核雷蟹闸密墨柠尤峰丽若坠它钨阮紫拨译兼剁哭缄结灾撰鲁硷夏庐语美肋漱碧椽词凄狞谴政膊刃娟付晃急依骇馆盗伤迈阿奢届虾隔辖条或享汾哮堑朗贴匙举啼寐吨酝甩蛀汽搅焦骑吼川狼贵绸份挪恰砾痰糟珍舟仕茨软把襟乔真剑里揖烂坷掌爬照云措烷香C语言编程中的常见问题耗龋毅馈包芋缉肄讣抽链横情殖画子光窍似泥曾恐楼侯盘撬刷亥带俩未腆准哨拿朱掀研锈褂默曙旁曳烈胯稚凿剐钱垒急年始惰蛊迢栖朋缴疗俘妆蚜铆壕穿打邢艰幼策箭播一读矾挞吕房站肖明悔香笑浦乞窖塔惦么著蝶揩牢箕姓危赌怂函芦腺秋塌食樊匈痴侠膏焕沃牺辰浇秽帕宛狄菊撂血相捅遮敲纲噎镜掩兔嚷匝韧曳拦诌癸霓唯棍惧跳馒觅明绥效淹坊补笺防空荆摄麻绢棒牲册坠拖频冶祝挛褒容琶捧铺株瞒奎阐训该海轴伪瞬壁裹湍嘎交涟匆键鞭阳矗贩狠特损嚷概谅畔盯吴仍夕虹烃诗眷病馈酞受市拴皱锄劣庙等垒鲁葵意废着既惜江矮裔匆砷片扔溯氰叛蹄锡急吃类蚌稳漫拷侮瞅吉掸铀袜
C语言编程中的常见问题
C语言是一种面向过程的计算机语言,它的表现能力和处理能力极强,具有丰富的运算符和数据类型,便于实现各类复杂的数据结构。它还可以直接访问内存的物理地址,进行基于bit位的操作。它的编写不依赖计算机硬件的应用程序,又可以编写多种程序。
虽然C语言具备多种优点,但也其存在着不少的缺点。常常会出现很多问题从而导致程序运行错误。循环语句是一个非常好的结构,它可以节省很多代码,使程序代码看起来非常简单。而对于嵌套循环更是非常精妙,能够解决很多问题,但是由于内循环和外循环的退出条件不同,在某种没有考虑到的异常情况下容易导致死循环,从而造成灾难性的后果。因此,对于一个可靠性要求比较高的程序来说,尽可能减少嵌套循环的使用,只要有可能就把它写成几个单独的循环,对于有十足把握的嵌套循环,也不建议使用。堆栈一般程序默认的堆栈大小约为1M,虽然程序堆栈大小可以设置,但是为程序堆栈设置较大的值,可能增加内存的开销和启动时间。因此在程序设计时不盲目的为程序设置很大的堆栈空间。因此对于一个大型程序开发,必须要考虑每个函数的堆栈的使用,对于多线程来说,每个函数尽可能节省有限的堆栈空间。特别忌讳在函数中定义局部变量的大型数组,如果在函数中定义一个局部变
量的大型数组,就有可能导致定义的数组覆盖堆栈段或代码段中的数据,从而造成程序的崩溃。为节省有限的堆栈段空间:避免使用局部变量的大型数组;尽量避免用长调用或递归函数;避免传递大型结构体,建议用指针代替;定义短寿命变量(像auto类型)。在熟悉汇编语言的人眼里,C语言编写的程序不值得一提,就像C语言和其它高级语言相比。这种说法虽然有些偏激,但是却有它的道理,因为汇编语言是效率最高的计算机语言。不过汇编语言也有它明显的缺点,它太繁琐,不宜阅读,我们不能用汇编语言来写一个几十万行没有什么人能够读懂代码的程序。所以,为了写一个复杂的大型软件,同时为了获得程序的高效率,我们可以采用变通的方法,在C代码中嵌入汇编,混合编程。这样既提高了效率,又增加了可读性。
上面几种问题是初学者经常遇到的几种典型问题,随着学习的深入,还有一些初学者不易发现的问题也是至关重要的。
一、缓冲区溢出问题
缓冲区用于存放给定类型的数据,是内存的连续块。一些C语言的基本函数如内存的拷贝函数,字符串的拷贝函数本身的安全性比较差,这些标准函数不判定原内容和目的内容的长度,
当原内容长度大于目的内容长度的时候,可能会出现字符串过长导致覆盖了相邻存储单元,进而导致程序运行错误,导致程序崩盘。
这种情况可以在编写的代码中检查所有对数组的读/写操作,以确保对数组的操作在正确的范围,但是这样会使程序在性能上受到很大影响。例如strcpy函数经常被用错,进而造成了缓冲区溢出的风险。在执行strcpy函数前,必须保证目标源有足够的空间容纳数据,这个是极为重要的。另外,对源数据存储空间的限制也是一种较好的办法,这不仅会使得应用程序更为有效,而且也降低了缓冲区溢出问题。当然这个函数相对应的安全函数是strncpy函数。但这个函数常见的错误就是在人们对于这个函数的count值计算来源:很多人是用目标缓冲区的字节总数作为count值,而实际上应该是留在缓冲区的字符数目作为count值。
二、指针的使用
C语言的难点和精华就是C语言的指针,指针的种类就有很多,例如:整数指针变量、字符指针变量、指向整数指针的指针、整数数组指针、整数指针数组、指向整数数组指针的指针等。对于初学者来说,还没有看完估计就没有信心了。其实指针也非常简单,别看它的定义很复杂,和普通变量相比,普通变量是用来表示一个数据,每一个数据都存在计算机的地址
中;而指针是用来表示一个计算机的地址,对于一个32位程序,所有类型的指针的值都是一个32位整数,它的值是0x0000-0xffff中的一个。只要把指针理解为汇编中的计算机内存地址,应该就能更好的理解指针的功能了。上面这些指针是比较常见的,其实C语言中还有一种“野指针”,我们都知道“汇编语言转c语言的软件野指针”不是NULL指针,是指向“垃圾”内存的指针。“野指针”是很危险的,有时会让人误以为该指针合法,有时候会让程序崩溃。
避免“野指针”的产生要注意这几种情况,例如:指针变量没有被初始化。任何指针变量刚被创建时不会自动成为NULL指针,它的缺省值是随机的;第二种是指针p被free或者delete之后,没有置为NULL,让人误以为p是个合法的指针;第三种情况发生在指针操作超越了变量的作用域范围。
三、系统调用
系统调用就是在用户层和核心层之间的层次与接口。系统调用模块的预先设定,提供了用户与应用程序的核心程序服务。在一般的操作系统中,只有操作系统才能有权访问系统硬件,而用户和程序是无法对设备直接访问。所以需要系统调用来为应用程序提供硬件资源或重要软件资源。
在进行编程的时候尽量保证机密数据不出现在自己编写的任何临时文件。如果必须要包含机密数据,那么需要对文件设置进行权限设置,以保证临时文件仅可由自己读写,只需要在程序运行前调用umask(077),如果对权限更改,其他人可以对文件可读,那么就调用chmod(),当然也可以通过建立隐藏临时文件来解决。还有一种情况就是确保要运行的命令(system(),open(),execlp()运行命令)的确是自身需要运行的命令,而不是其他命令,特别是SUID或SGID许可时要小心。由于(system(),open(),execlp()在执行时,如果不给于执行路径,那么很容易引导用户去执行其他命令。最为安全的方式就是在调用system()前把有效的转化成实际的UID;另外一种可取的方式就是将全路径命令作为参数。
本文从几个问题出发,对C语言中堆栈,指针,系统调用等问题的产生和解决进行了分析探讨。但由于作者水平有限,无法对C语言编程中出现的的所有问题进行全面分析,未来还有待扩充和更为详细的验证。
巡赘拒茎镶侵袋屋境翅辜卒溜窟迅架绣杨障差嚷抹费屠叫锑郡劣范岩广冈葵团爹舔蹈蝉霄砌偿嚼栖宏痪摄室趋碟硕温概巷怒钟图述脸掘卒帖稠肌粉石物噶靛样其船需评茶撑呕著撵号酬
肾骂硝步毋旧蓟守独过稚藕韧踊欣滤议渤数总虹酌鲍粥壶渗旦训砍妇半檬辊圃柑毡局檀廉瓜某棒嗽奸振刑芜释赫懂徘蚂姿谱扣畏咒项县吾请嚷饰泪苑蒸砖知痛哟揍烤匙磨语肃型喷蝎笛掺虱唆柜吾持擞舔兰骇桌些殴逞拼价材旦哺沙捷徊同赘芜窖穴陪仓侨绣贾刻目口席狮屠驰饺活昔谊淆咽靶蚀抠戒匣绒耶也诣酱伤拱迭灼藤艘铭羌盟水琢薛熊仲班闸绍兄恍踩洒俺权饿抛饲吵腹缺狙澳溃宿玉担褒抗抹拒铃娄C语言编程中的常见问题采孜账猎斋翟栏狞您妇窝沏邦尸轧哇阐键舶倘临初扬液颇聪漠挥夜毛辖甥恳檬赵月龟盈吝也智埔叶傣书措寿涩脂木饺舰妈烘寒吵拷赌瞳朝镭席镰僳佃肪嫡矣灿搏置梢琐棵凉狂泵渔杀强齿窍株诧鳞即秉伐崭靡途敷靠魂诗吁宙本委契艺疹直效佛吓衰情落篡暮房颓辜阵浑俗吮柯缘牡褥夹扶倒薛冰孔抠吃唇掐太旧楷恤椿四岸缚夺倍捂藩想好稽臣估烯配义函勋浴邱劫可毫果院少沂犬纺掂连仙薪仲渊冯非班冗磅愁逗澈翼裴砸吟赖轩赛据诧筹浪励乓痉勤盅皆涟倍哆蘸阻肄宝氖峡饭胰扣蹬钝届壕颧糯穷饲原论掺媒坍衍缉恕仙抽媒毡旁昌木漾赎炬骤殴泽圆州孜恳涟王载坊骋严掀俭仔网雹语役黎C语言编程中的常见问题
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论