在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

分享10道有趣的嵌入式C語言面試題及答案

工程師進階筆記 ? 來源:CSDN技術社區 ? 2023-05-09 10:54 ? 次閱讀

10個C語言面試題,涉及指針、進程、運算、結構體、函數、內存,看看你能做出幾個!

1.gets()函數

問:請找出下面代碼里的問題:

#include
intmain(void)
{
charbuff[10];
memset(buff,0,sizeof(buff));

gets(buff);

printf("
Thebufferenteredis[%s]
",buff);

return0;
}

答:上面代碼里的問題在于函數gets()的使用,這個函數從stdin接收一個字符串而不檢查它所復制的緩存的容積,這可能會導致緩存溢出。這里推薦使用標準函數fgets()代替。

2.strcpy()函數

問:下面是一個簡單的密碼保護功能,你能在不知道密碼的情況下將其破解嗎?

#include

intmain(intargc,char*argv[])
{
intflag=0;
charpasswd[10];

memset(passwd,0,sizeof(passwd));

strcpy(passwd,argv[1]);

if(0==strcmp("LinuxGeek",passwd))
{
flag=1;
}

if(flag)
{
printf("
Passwordcracked
");
}
else
{
printf("
Incorrectpasswd
");

}
return0;
}

答:破解上述加密的關鍵在于利用攻破strcpy()函數的漏洞。所以用戶在向“passwd”緩存輸入隨機密碼的時候并沒有提前檢查“passwd”的容量是否足夠。

所以,如果用戶輸入一個足夠造成緩存溢出并且重寫“flag”變量默認值所存在位置的內存的長“密碼”,即使這個密碼無法通過驗證,flag驗證位也變成了非零,也就可以獲得被保護的數據了。例如:

$./psswdaaaaaaaaaaaaa

Passwordcracked

雖然上面的密碼并不正確,但我們仍然可以通過緩存溢出繞開密碼安全保護。

要避免這樣的問題,建議使用 strncpy()函數。

作者注:最近的編譯器會在內部檢測棧溢出的可能,所以這樣往棧里存儲變量很難出現棧溢出。在我的gcc里默認就是這樣,所以我不得不使用編譯命令‘-fno-stack-protector’來實現上述方案。

3.main()的返回類型

問:下面的代碼能 編譯通過嗎?如果能,它有什么潛在的問題嗎?

#include

voidmain(void)
{
char*ptr=(char*)malloc(10);

if(NULL==ptr)
{
printf("
Mallocfailed
");
return;
}
else
{
//Dosomeprocessing
free(ptr);
}

return;
}

答:因為main()方法的返回類型,這段代碼的錯誤在大多數編譯器里會被當作警告。main()的返回類型應該是“int”而不是“void”。

因為“int”返回類型會讓程序返回狀態值。這點非常重要,特別當程序是作為依賴于程序成功運行的腳本的一部分運行時。

4.內存泄露

問:下面的代碼會導致內存泄漏嗎?

#include

voidmain(void)
{
char*ptr=(char*)malloc(10);

if(NULL==ptr)
{
printf("
Mallocfailed
");
return;
}
else
{
//Dosomeprocessing
}

return;
}

答:盡管上面的代碼并沒有釋放分配給“ptr”的內存,但并不會在程序退出后導致內存泄漏。在程序結束后,所有這個程序分配的內存都會自動被處理掉。但如果上面的代碼處于一個“while循環”中,那將會導致嚴重的內存泄漏問題!

提示:如果你想知道更多關于內存泄漏的知識和內存泄漏檢測工具,可以來看看我們在Valgrind上的文章。

5.free()函數

問:下面的程序會在用戶輸入’freeze’的時候出問題,而’zebra’則不會,為什么?

#include

intmain(intargc,char*argv[])
{
char*ptr=(char*)malloc(10);

if(NULL==ptr)
{
printf("
Mallocfailed
");
return-1;
}
elseif(argc==1)
{
printf("
Usage
");
}
else
{
memset(ptr,0,10);

strncpy(ptr,argv[1],9);

while(*ptr!='z')
{
if(*ptr=='')
break;
else
ptr++;
}

if(*ptr=='z')
{
printf("
Stringcontains'z'
");
//Dosomemoreprocessing
}

free(ptr);
}

return0;
}

答:這里的問題在于,代碼會(通過增加“ptr”)修改while循環里“ptr”存儲的地址。當輸入“zebra”時,while循環會在執行前被終止,因此傳給free()的變量就是傳給malloc()的地址。

但在“freeze”時,“ptr”存儲的地址會在while循環里被修改,因此導致傳給free()的地址出錯,也就導致了seg-fault或者崩潰。

6.使用_exit退出

問:在下面的代碼中,atexit()并沒有被調用,為什么?

#include

voidfunc(void)
{
printf("
Cleanupfunctioncalled
");
return;
}

intmain(void)
{
inti=0;

atexit(func);

for(;i<0xffffff;i++);?
?????
????_exit(0);?
}

這是因為_exit()函數的使用,該函數并沒有調用atexit()等函數清理。如果使用atexit()就應當使用exit()或者“return”與之相配合。

7.void*和C結構體

問:你能設計一個能接受任何類型的參數并返回interger(整數)結果的函數嗎?

答:如下:

intfunc(void*ptr)

如果這個函數的參數超過一個,那么這個函數應該由一個結構體來調用,這個結構體可以由需要傳遞參數來填充。

8. * 和 ++ 操作

問:下面的操作會輸出什么?為什么?

#include

intmain(void)
{
char*ptr="Linux";
printf("
[%c]
",*ptr++);
printf("
[%c]
",*ptr);

return0;
}

答:輸出結果應該是這樣:

[L]

[i]

因為“++”和“ * ” 的優先權一樣,所以“ * ptr++ ”相當于 “ * (ptr++) ”。即應該先執行 ptr++,然后才是 * ptr,所以操作結果是“L”。第二個結果是“i”。

9.問:修改代碼片段

問:下面的代碼段有錯,你能指出來嗎?

#include

intmain(void)
{
char*ptr="Linux";
*ptr='T';

printf("
[%s]
",ptr);

return0;
}

答:這是因為,通過 * ptr = ‘T’,會改變內存中代碼段(只讀代碼)“Linux”的第一個字母。這個操作是無效的,因此會造成segment-fault或者崩潰。

10.返回本地變量的地址

問:下面代碼有問題嗎?如果有,該怎么修改?

#include

int*inc(intval)
{
inta=val;
a++;
return&a;
}

intmain(void)
{
inta=10;
int*val=inc(a);
printf("
Incrementedvalueisequalto[%d]
",*val);

return0;
}

答:盡管上面的程序有時候能夠正常運行,但是在“inc()”中存在嚴重的漏洞。這個函數返回本地變量的地址。

因為本地變量的生命周期就是“inc()”的生命周期,所以在inc結束后,使用本地變量會發生不好的結果。這可以通過將main()中變量“a”的地址來避免,這樣以后還可以修改這個地址存儲的值。

審核編輯:湯梓紅

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 嵌入式
    +關注

    關注

    5125

    文章

    19438

    瀏覽量

    313003
  • 內存
    +關注

    關注

    8

    文章

    3102

    瀏覽量

    74879
  • C語言
    +關注

    關注

    180

    文章

    7628

    瀏覽量

    139649
  • 函數
    +關注

    關注

    3

    文章

    4365

    瀏覽量

    63838
  • 指針
    +關注

    關注

    1

    文章

    484

    瀏覽量

    70901

原文標題:分享 10 道有趣的嵌入式 C 語言面試題及答案

文章出處:【微信號:工程師進階筆記,微信公眾號:工程師進階筆記】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    關于C語言10面試題

    各位,今天給大家搜集了10比較好的面試題,涉及了指針、運算、結構體、函數、內存,應該來說比較全面了,有興趣的做一下檢測一下自己的水平吧!
    發表于 09-15 10:28 ?1287次閱讀

    常見的嵌入式C語言面試題

    數組是最基本的數據結構,關于數組的面試題也屢見不鮮,本文羅列了一些常見的面試題,僅供參考。目前有以下18題目。
    發表于 07-18 10:46 ?925次閱讀

    經典嵌入式面試題

    經典嵌入式面試題
    發表于 08-20 09:39

    C語言面試題大全

    C語言面試題大全{:1:}{:2:}{:1:}{:1:}{:1:}{:1:}
    發表于 04-10 20:51

    又到一年畢業季,分享經典嵌入式面試題

    比較全面的嵌入式面試題,問答、選擇題形式,有答案。
    發表于 08-18 17:00

    C語言 經典面試題

    C語言經典面試題目.doc
    發表于 08-05 22:03

    嵌入式開發面試題3題,思考一下,你會幾個

    嵌入式開發面試題3題,思考一下,你會幾個1.ARM異常有哪些分類?2.ARM異常會發生哪些硬件操作?3.請簡述中斷和異常的差別?
    發表于 08-21 14:49

    c語言面試題,c++面試題下載

    c語言面試題,c++面試題1. static有什么用途?(請至少說明兩種) 1) 限制變量的作用域 2) 設置變量的存儲域 2.&
    發表于 10-22 11:19 ?5次下載

    c語言面試題

    c語言面試題集(單片機)C language problem(20151125084232)
    發表于 12-18 14:05 ?9次下載

    c語言面試題

    c語言面試題
    發表于 11-05 16:48 ?0次下載

    C語言經典面試題

    面試題
    發表于 12-20 22:41 ?0次下載

    C語言經典面試題

    C語言 經典面試題
    發表于 01-05 11:27 ?0次下載

    淺談嵌入式軟件開發經典面試題

    嵌入式軟件開發經典面試題
    的頭像 發表于 03-20 14:25 ?8043次閱讀
    淺談<b class='flag-5'>嵌入式</b>軟件開發經典<b class='flag-5'>面試題</b>

    Java的經典面試題答案詳細說明

    發現網上很多Java面試題都沒有答案,所以花了很長時間搜集整理出來了這套Java面試題大全,希望對大家有幫助哈~ 博主已將以下這些面試題整理成了一個Java
    發表于 09-07 08:00 ?0次下載
    Java的經典<b class='flag-5'>面試題</b>和<b class='flag-5'>答案</b>詳細說明

    c語言面試題集(完整版)

    電子發燒友網站提供《c語言面試題集(完整版).pdf》資料免費下載
    發表于 10-20 11:20 ?4次下載
    <b class='flag-5'>c</b><b class='flag-5'>語言</b><b class='flag-5'>面試題</b>集(完整版)
    主站蜘蛛池模板: 又色又爽又黄视频 | 男女无遮挡在线完整视频 | 成人黄色免费网站 | 国产午夜精品不卡片 | 国产视频日本 | 日日爱视频 | 国产中文99视频在线观看 | 日韩三级免费观看 | 美女一级a毛片免费观看 | 99国产成人精品2021 | 一区二区三区精品国产欧美 | 久久国产精品永久免费网站 | 色午夜在线 | 一级特黄视频 | 在线亚洲国产精品区 | 操日韩美女 | 美日韩一区二区 | 欧美性video精品 | 国产精品嫩草影院一二三区入口 | 18性夜影院午夜寂寞影院免费 | 久久久久久久久久久9精品视频 | 6969精品视频在线观看 | 日韩黄页| 二区中文字幕 | 伊人久久大香线蕉综合网站 | 日本三级黄色网址 | 成人99| 三级a黄| 视频一区二区在线观看 | 好吊色视频988gao在线观看 | 狠狠操天天干 | 欧美高h| 午夜爱爱免费视频 | 亚洲理论片在线观看 | 中文字幕在线二区 | 免费观看视频高清www | 精品人人| 1024毛片基地 | 天天干天天干天天 | 午夜手机福利视频 | www.五月婷|