日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

这道笔试题竟然运行不出错

發布時間:2023/12/20 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 这道笔试题竟然运行不出错 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

#讀者提供的面試題

下面這張截圖是一個讀者在面試的時候遇到的題目,是哪個公司的我就不說出來了,我在微信朋友圈發了這個題目后,有幾個好友給我留言說自己也寫了這道題。

題目:下面這段代碼有什么問題?

#后續

然后我就用這個圖片發了朋友圈,很多人也回復了,天資跟我差不多的人呢,都看出來了就是 if 判斷的代碼需要往上移動下,要不然呢,malloc 后沒有釋放,就會出現內存泄漏。

這個是基本的,還有一些后續的回復,有幾個微信好友回復還是比較不錯,在這里分享給大家。

#我寫的測試源碼

#include?"stdio.h" #include?"stdlib.h" #include?"string.h"int?swap(void?*a,void*?b,int?size) {void?*p;p?=?malloc(size);if(size?<=?0){printf("error");return?-1;}memcpy(p,a,size);memcpy(a,b,size);memcpy(b,p,size);free(p);return?0; }?int?main() {char?*a?=?"12344";char?*b?=?"adbde";swap(a,b,5);printf("a:%s\tb:%s\n",a,b);return?0; }

程序輸出

a:adbde?b:12344-------------------------------- Process?exited?after?0.03298?seconds?with?return?value?0 請按任意鍵繼續.?.?.

#void* 指針

程序里面有一個 void 指針,這個需要注意下,void指針是可以接收所有類型的指針的,但是其他類型的指針是不能直接接收void指針的。

比如這樣

#include?"stdio.h"int?main() {?void?*p?=?NULL;char?*p1?=?NULL;p?=?p1;return?0; }

下面這樣可能是有問題的

我說是可能有問題是因為GCC、ANSI C 的編譯情況是不同的。

#include?"stdio.h"int?main() {?void?*p?=?NULL;char?*p1?=?NULL;p1?=?p;return?0; }

#程序有什么問題?

這段代碼有以下幾點問題:

1、入參a和b都是void類型的指針,不清楚a和b指向buff的長度是否都為size?size不要設置成int,最好設置成unsigned?int,?而且a和b入參一定不能代入const?xxxxx?*類型的實參;

2、?進入函數體之后應該首先判斷size是否小于等于0、a和b是否為NULL,如果size小于等于0,或者a和b存在NULL,那其他代碼將毫無意義。

3、沒有if(!p)對malloc進行判斷直接使用p,剩余內存較低情況下malloc一片大內存是有可能fail的,直接使用p就會段錯,而且不建議malloc。

4、memcpy時因并不明確a?b指針指向buff的長度是否都為size,存在內存越界風險。

綜上述修改代碼為:

int?swap(void?*a,?void?*b,?uint32_t?len_a,?uint32_t?len_b) {if?(?!a?||?!b?||?!len_a?||?!len_b?||?len_a!=len_b?)?{printf("invalid?param!?\n");return?-1;}if?(?a==b?)?{printf("the?same!?\n");return?0;}uint32_t?len?=?len_a;char?*p?=?(char?*)malloc(len);if?(!p)?{printf("malloc?fail!?\n");return?-1;}memcpy(p,a,len);memcpy(a,b,len);memcpy(b,p,len);free(p);return?0; }

#參考代碼

//我寫了一個swap: //感謝讀者LinuxEnginetypedef?struct?{char?byte[4]; }?stdb_4; typedef?struct?{char?byte[8]; }?stdb_8;void?my_swap(void?*p,?void?*q,?size_t?p_sz,?size_t?q_sz) {char?buff[256];if?(?!p?||?!q?||!p_sz?||?!q_sz?||?p_sz?!=?q_sz?||?p==q?)return;int?sz?=?p_sz;if?(?sz?==?4?)?{stdb_4?t??=?*(stdb_4?*)p;*(stdb_4?*)p??=?*(stdb_4?*)q;*(stdb_4?*)q??=?t;return;}?else?if?(?sz?==?8?)?{stdb_8?t??=?*(stdb_8?*)p;*(stdb_8?*)p??=?*(stdb_8?*)q;*(stdb_8?*)q??=?t;return;}while?(?sz?>?sizeof(buff)?)?{my_swap?(p,?q,?sizeof(buff));p?=?(char?*)p?+?sizeof(buff);q?=?(char?*)q?+?sizeof(buff);sz?-=?sizeof(buff);}memcpy(buff,?p,????sz);memcpy(p,????q,????sz);memcpy(q,????buff,?sz); }

#后續

感謝讀者LinuxEngine給出的答案以及示例代碼,大家如果看到有優化的地方,可以在評論區說出你的答案,寫程序是一個非常嚴謹的事情,程序寫得嚴謹了,該考慮到的問題都能想到了,大概率就能去除一些比較明顯的bug。

祝大家周末愉快!

? #推薦閱讀:

? ??專輯|Linux文章匯總

? ??專輯|程序人生

? ??專輯|C語言

嵌入式Linux

微信掃描二維碼,關注我的公眾號?

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的这道笔试题竟然运行不出错的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。