IT培训机构|91免费精品视频|专注编程培训|91免费精品|软件开发培训_91免费国产视频_华清远见教育

當(dāng)前位置:首頁 > 嵌入式培訓(xùn) > 嵌入式學(xué)習(xí) > 講師博文 > 兩道面試題所引發(fā)的C指針的思考

兩道面試題所引發(fā)的C指針的思考 時間:2018-08-15      來源:未知

C語言是一門使用比較廣泛的高級編程語言,而指針則是C語言的精髓所在,可以說學(xué)習(xí)C語言不會靈活使用指針就談不上精通C語言。但是由于C語言指針的靈活性導(dǎo)致了我們在使用過程中出現(xiàn)莫名其妙的各種問題,甚至是段錯誤。

本文引用地址://www.dgruiqian.com/emb/Column/7260.html

本文將以兩道典型的面試題為切入點,引發(fā)我們對于C語言指針的思考。并給予詳細(xì)的解釋,從原理角度來解析C指針。全文也是源碼分析加結(jié)果演示的形式說明問題所在。

問題一:

一下的代碼段是否正確,如果正確結(jié)果是什么?如果不正確如何改正?

void fun(char *p)

{

p=(char *)malloc(100);

}

int main(int argc, const char *argv[])

{

char *str=NULL;

fun(str);

strcpy(str,"hello");

printf("%s\n",str);

return 0;

}

如果大家不仔細(xì)看的話,一定認(rèn)為是正確的,因為沒有發(fā)現(xiàn)明顯的語法錯誤。不錯你的想法是對的,編譯的時候一定可以通過,但是當(dāng)你運行可執(zhí)行程序的時候發(fā)現(xiàn):“哎呀,段錯誤!”,也沒錯,確實也發(fā)生了段錯誤,也許這個段錯誤比較隱蔽不易發(fā)現(xiàn)并定位。下面我們使用gdb來定位到段錯誤的位置,并分析錯誤原因:

命令行輸入:gcc -g -rdynamic test.c (test.c即是我們將源碼頭文件加上編寫的C語言源文件),然后生成了可以以用于gdb調(diào)試且可以定位段錯誤的可執(zhí)行程序,接下來輸入gdb ./a.out 進(jìn)入gdb調(diào)試模式,輸入r運行程序,則立馬定位到strcpy(str,"hello"); 這行程序段,于是我們回到程序中分析代碼:發(fā)現(xiàn)是我們把一個指針常量NULL作為fun函數(shù)的參數(shù)傳遞給了p,造成了子函數(shù)中對一個指針常量進(jìn)行賦值操作,于是就在程序運行中調(diào)用fun函數(shù)的時候造成了段錯誤。

以上就是這段代碼的錯誤分析,既然我們通過gdb定位到了段錯誤的位置,也分析出了段錯誤產(chǎn)生的原因,那么如何修改代碼才能實現(xiàn)相應(yīng)的功能還不至于造成段錯誤呢?考慮到要盡量保證代碼段的完整性,于是想到從傳遞的參數(shù)上尋突破口。既然不能傳遞指針常量,那么我們想到傳遞一個值能夠裝得下指針不就行了于是對代碼段做如下改變(修改部分已做好了紅色標(biāo)記):

void fun(char **p)

{

*p=(char *)malloc(100);

}

int main(int argc, const char *argv[])

{

char *str=NULL;

fun(&str);

strcpy(str,"hello");

printf("%s\n",str);

return 0;

}

對比發(fā)現(xiàn),這次我們傳遞了一個二級指針&str,實際上就是傳遞了裝載指針的容器,這樣以來我們就可以把在子函數(shù)中動態(tài)分配的內(nèi)存空間的首地址放到了這個“容器”中了(即是str被賦值上了新分配內(nèi)存的首地址)。在一次編譯執(zhí)行,無段錯誤,結(jié)果輸出“hello”字符串。也就完美地解決了這道錯誤非常隱蔽的面試題。同樣有的同學(xué)會想,把NULL掉咋樣?編譯運行發(fā)現(xiàn)還是出現(xiàn)段錯誤,還是同樣的問題:指針str屬于局部變量,系統(tǒng)會隨機分配一個地址給str,同樣是指針常量賦值。 而當(dāng)我們解決了這道題,我們能夠感受到指針的靈活性和操作的隱蔽性,我們也就知道了常量是不能被賦值的(因為他被系統(tǒng)認(rèn)為是只讀),還知道了將一個二級指針作為參數(shù)傳遞可以保存一個地址的值,這也是編程的一個技巧。

接下來我們在看一看第二道題:

問題二:

以下代碼段的執(zhí)行結(jié)果?

int main(int argc, const char *argv[])

{

int i,n=0;

for(i=1;i

{

n=10*n+*argv[i]-'0';

}

printf("%d\n",n);

return 0;

}

./a.out 12 345 678

雖然代碼很簡練,但是如果不細(xì)心分析還是很難把這道題答案寫出來的,甚至是沒有任何思路。實際上這道題考察的是大家對于指針的掌握和ascii的一些知識:大家一定要理解*argv[i]意思,如果不注意可能會認(rèn)為是取命令行參數(shù)的第二個字符串的值,其實不然,這樣理解的話大家對于指向一個字符串的字符指針的的不理解,指向一個字符串的字符指針實際上是指向一個字符串首字符的地址,命令行參數(shù)輸入的12 345 678看似數(shù)字,實際上是一個個字符串,*argv[i]的意思也就是取各自字符串的首字符也就是取1、3、6,說到這里這道面試題也就引刃而解了。那么*argv[i]-'0'是啥意思呢?很顯然嗎,就是將ascii表示的字符轉(zhuǎn)化為對應(yīng)的數(shù)字也就是數(shù)字1、3、6。到這里我們在通過推理就得到了終的結(jié)果:136。

通過了這一番地分析是不是也挺簡單的,那必須的啊,通過這道面試題我們也就知道了:指向一個字符串的指針實際上就是把字符串的首地址賦給了指針變量,還有就是一個字符減去’0’就能得到字符所對應(yīng)的數(shù)字。

當(dāng)然這只是兩道比較易錯的使用指針的面試題,很多面試題都是從大家對指針本質(zhì)的認(rèn)識上著手來考察大家,只要掌握指針的本質(zhì),了解常見段錯誤的產(chǎn)生的原因和處理方案,了解C語言內(nèi)存的分配情況就能煉就一雙”火眼金睛“,從本質(zhì)上真正精通C語言。以上也是本人通過實踐和深入的分析得出的一些經(jīng)驗,如若有更加簡單易懂的方案望給出寶貴意見,待以后修正完善。

上一篇:wireshark抓包工具如何使用

下一篇:Linux C中對json格式數(shù)組數(shù)據(jù)的生成與解析

熱點文章推薦
華清學(xué)員就業(yè)榜單
高薪學(xué)員經(jīng)驗分享
熱點新聞推薦
前臺專線:010-82525158 企業(yè)培訓(xùn)洽談專線:010-82525379 院校合作洽談專線:010-82525379 Copyright © 2004-2022 北京華清遠(yuǎn)見科技集團有限公司 版權(quán)所有 ,京ICP備16055225號-5,京公海網(wǎng)安備11010802025203號

回到頂部

主站蜘蛛池模板: 气体检测仪_气体传感器_可燃气体检测仪-精讯畅通电子科技 | 金属网帘|金属帘|装饰网帘|金属环网|金属幕墙网|金属垂帘|金属扣帘-安平县名图金属丝网制品有限公司 | 数控落地镗铣床_数控刨台式镗铣床_数控龙门加工中心-青岛辉腾机械设备有限公司 | 山东凯达起重机械有限公司-单梁行车,龙门吊,提梁机,门式起重机,悬臂起重机 | 饲料车_散装饲料车_畜禽运输车_散装饲料运输车_饲料车厂家_铝合金运猪车-程力专用汽车股份有限公司 | 衡水一体化污水处理设备|循环水旁滤器|加药装置|钢厂浊环净化装置|河北欧意科技集团有限公司 | 蜀山人才网_蜀山招聘网_求职找工作平台 | 首创十载—广州专业美博会展览设计公司_美博会展台搭建工厂 | 收银系统_收银机_pos收款机_门店管理系统-客如云 | 青浦区摄像头安装/青浦区无线网络覆盖/青浦区网络调试公司/青浦区IT外包公司/金山区网络维护公司/金山区防火墙调试公司 | 郑州宏大纺机有限公司| 襄阳燃烧器厂家-低氮燃烧器价格-河北五通道燃烧器就找襄阳市胜合燃力设备有限公司一站式服务 | 西门子伺服电机维修_西门子变频器维修_西门子伺服驱动器维修_数控系统维修_PL维修-上海仰光电子 西克制冷官网│制冷机组冷风机冷库设备厂家-西克制冷(无锡)有限公司_西克制冷(无锡)有限公司 | 上海办公家具_高端实木办公家具_现代智能办公家具定制厂-上海迈亚家具有限公司 | 配重铁砂|合金钢丸|山东铁砂|济南嘉日金属制品有限公司 | 上海联锐精密机械有限公司-【官网】| 塑料胶水|PVC胶水|PP胶水|橡胶胶水|强力胶水|透明胶水|胶粘剂|粘合剂|UV胶-聚力胶水厂家 | 围墙护栏,护栏网,围栏,锌钢栅栏,护栏网厂家--安平县沃达金属丝网制造有限公司 | 活性炭吸附设备,UV光氧废气处理设备,破碎机专用除尘器,催化燃烧设备厂家-河北碧清环保设备有限公司 | 上海宽带安装-上海宽带办理-400电话-包月电话-靓号 | 扭矩测试仪_拉力测试仪_扭力扳手测试仪_测试台-上海铸衡电子科技有限公司 | 托辊|滚筒|聚氨酯托辊|缓冲托辊|尼龙托琨|衡水良龙输送机械有限公司 | 深圳市佳顺优印印刷有限公司,佳顺优印,画册印刷,海报印刷,封套印刷,手提袋印刷,包装盒印刷,彩盒印刷,无碳纸印刷,不干胶印刷,信封印刷,便笺印刷,笔记本印刷,台历印刷,挂历印刷,国际会展中心附近印刷厂,宝安印刷厂,宝安教材印刷厂 | 塑胶跑道厂家_河北小区健身器材_悬浮地板-河北达创体育器材有限公司 | 松下PLC经销商-松下传感器-放大器-电磁阀-光电开关-金器[东莞均钛]品牌气动元件及工控产品一站式供应商 | 厦门,泉州自助餐上门|生日自助餐|婚礼自助餐|公司聚会自助餐|户外烧烤|冷餐|茶歇外卖配送-福建非选餐饮公司 | 青岛除甲醛公司|青岛甲醛治理|青岛除甲醛|甲醛检测|光触媒除甲醛|装修除味除甲醛|新房除甲醛|青岛室内环境污染检测治理|青岛闪洁环保科技有限公司官网 | 轮转印刷机_商标印唛机_超声波切唛机_瑞安市明辉机械有限公司 | 美标球阀_美标闸阀-浙江川一阀门有限公司 | 行域招聘网-行业领域专业技术人才招聘求职平台 | 煤粉喷枪_高炉喷煤枪_陶瓷喷煤枪-北京耐默公司 | 瑞安网站建设_网站制作_做网站找瑞安联创网络:专业网页制作、手机网站、SEO百度网站关键字优化 软文营销推广-新闻稿发布-软文撰写-百科词条编辑-品牌全案策划推广网络营销传播-喜尚传媒 | 山东荣利中石油机械有限公司| 亚洲一区日韩一区欧美一区a,中文字幕乱妇无码AV在线,欧美日韩免费在线观看,国产精品一区二区三区免费,日韩精品免费一线在线观看,日韩一本在线,国产呦精品一区二区三区下载,国产日韩精品一区二区在线观看,欧美日韩高清一区二区三区,日韩在线免费观看视频,欧美日韩一区在线观看 | 天津韬艺科技有限公司,天津网站建设公司,天津网站设计公司,品牌网站策划公司 | 在线计算网 - 超多超好用的在线小工具 | 深圳心理咨询-专业心理咨询服务平台「专家免费在线」-深圳从心开始心理O2O | 耐磨锤头|合金锤头|高铬耐磨锤头|破碎机锤头|双金属双液复合锤头_巩义东辰实业 合金耐磨锤头铸造厂 | 液晶拼接屏_三星46寸/55寸/LG液晶拼接屏_深圳拼接墙厂家_电视大屏幕液晶拼接_高清工业级液晶监视器 | 卧式镗铣床,道斯镗铣机床加工中心-江苏道斯数控科技有限公司 | 西安生殖医学医院_陕西省老医协生殖医学医院【官方网站】 |