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

當前位置:首頁 > 嵌入式培訓 > 嵌入式招聘 > 嵌入式面試題 > 嵌入式最基本的面試題,老鳥總結

嵌入式最基本的面試題,老鳥總結 時間:2018-08-22      來源:未知

下面總結出了一下嵌入式面試中最常見的一些題型,而且都是每次面試都會提及到的,因為我面試了很多公司總結的一些經驗,可以收藏學習哦。

常見基本類型的字節大小

32位操作系統

char :1個字節(固定)

*(即指針變量): 4個字節(32位機的尋址空間是4個字節。同理64位編譯器)(變化*)

short int : 2個字節(固定)

int: 4個字節(固定)

unsigned int : 4個字節(固定)

float: 4個字節(固定)

double: 8個字節(固定)

long: 4個字節

unsigned long: 4個字節(變化*,其實就是尋址控件的地址長度數值)

long long: 8個字節(固定)

1.指向字符串常量的指針,指向字符串的常量指針(const)

const char* p = "hello"; // 指向 "字符串常量"

p[0] = 'X'; // 錯誤! 想要修改字符串的第一個字符. 但是常量不允許修改

p = p2; // 正確! 讓p指向另外一個指針.

char* const p = "hello"; // 指向字符串的" 常量的指針"

p[0] = 'X'; // 正確! 允許修改字符串, 因為該字符串不是常量

p = p2; // 錯誤! 指針是常量, 不許修改p的指向

char const * 和 const char* 是一樣的. const 的位置在char左邊還是右邊都一樣.

常量指針的const應當寫在 *星號的右邊.

指向常量字符串的常量指針的寫法是 const char* const p = "xx"; 要2個const

2.typedef & #define的問題

有下面兩種定義pStr數據類型的方法,兩者有什么不同?哪一種更好一點?

typedef char* pStr;

#define pStr char*;

分析:通常講,typedef要比#define要好,特別是在有指針的場合。請看例子:

typedef char* pStr1;

#define pStr2 char *

pStr1 s1, s2;

pStr2 s3, s4;

在上述的變量定義中,s1、s2、s3都被定義為char *,而s4則定義成了char,不是我們所預期的指針變量,根本原因就在于#define只是簡單的字符串替換而typedef則是為一個類型起新名字。上例中define語句必須寫成 pStr2 s3, *s4; 這這樣才能正常執行。

3.const的問題

(1)可以定義const常量,具有不可變性。

例如:const int Max=100; int Array[Max];

(2)便于進行類型檢查,使編譯器對處理內容有更多了解,消除了一些隱患。

例如: void f(const int i) { .........} 編譯器就會知道i是一個常量,不允許修改;

(3)可以避免意義模糊的數字出現,同樣可以很方便地進行參數的調整和修改。

如(1)中,如果想修改Max的內容,只需要:const int Max=you want;即可!

(4)可以保護被修飾的東西,防止意外的修改,增強程序的健壯性。 還是上面的例子,如果在函數體內修改了i,編譯器就會報錯;

例如: void f(const int i) { i=10;//error! }

(5)可以節省空間,避免不必要的內存分配。 例如:

#define PI 3.14159 //常量宏

const doublePi=3.14159; //此時并未將Pi放入RAM中 ......

doublei=Pi; //此時為Pi分配內存,以后不再分配!

double I=PI; //編譯期間進行宏替換,分配內存

double j=Pi; //沒有內存分配

double J=PI; //再進行宏替換,又一次分配內存!

const定義常量從匯編的角度來看,只是給出了對應的內存地址,而不是象#define一樣給出的是立即數,所以,const定義的常量在程序運行過程中只有一份拷貝,而#define定義的常量在內存中有若干個拷貝。

(6)提高了效率。

編譯器通常不為普通const常量分配存儲空間,而是將它們保存在符號表中,這使得它成為一個編譯期間的常量,沒有了存儲與讀內存的操作,使得它的效率也很高。

sizeof與strlen的區別:

char str[20]="0123456789";

int a=strlen(str); // a=10;strlen 計算字符串的長度,以\0'為字符串結束標記。

int b=sizeof(str); // b=20;sizeof 計算的則是分配的數組str[20] 所占的內存空間的大小,不受里面存儲的內容影響.

上面是對靜態數組處理的結果,如果是對指針,結果就不一樣了

char* ss = "0123456789";

sizeof(ss)結果4===》ss是指向字符串常量的字符指針,sizeof 獲得的是一個指針的之所占的空間,應該是長整型的,所以是4,sizeof(*ss) 結果1===》*ss是第一個字符 其實就是獲得了字符串的第一位'0' 所占的內存空間,是char類型的,占了1位strlen(ss)= 10如果要獲得這個字符串的長度,則一定要使用 strlen

Sizeof結構體為結構體中定義的數據類型的總的空間(注意字節對齊)。

Sizeof對union為union中定義的數據類型的最大數據類型的大小。

5 .auto, register, static分析

auto即C語言中局部變量的默認屬性,編譯器默認所有的局部變量都是auto的,定義的變量都是在棧中分配內存。

static關鍵字指明變量的“靜態”屬性,同時具有“作用域限定符”的意義,修飾的局部變量存儲在程序靜態區,static的另一個意義是文件作用域標示符。

static修飾的全局變量作用域只是聲明的文件中,static修飾的函數作用域只是聲明的文件中

register關鍵字指明將變量存儲于寄存器中,register只是請求寄存器變量,但不一定請求成功。register變量的必須是CPU寄存器可以接受的值,不能用&運算符獲取register變量的地址,這樣使用的好處是處理快。

6. const, volatile同時修飾變量

(1) “編譯器一般不為const變量分配內存,而是將它保存在符號表中,這使得它成為一個編譯期間的值,沒有了存儲與讀內存的操作。”

(2) volatile的作用是“告訴編譯器,i是隨時可能發生變化的,每次使用它的時候必須從內存中取出i的值”。

一,const, volatile含義

(1)const含義是“請做為常量使用”,而并非“放心吧,那肯定是個常量”。

(2)volatile的含義是“請不要做自以為是的優化,這個值可能變掉的”,而并非“你可以修改這個值”。

二,const, volatile的作用以及起作用的階段

(1)const只在編譯期有用,在運行期無用

const在編譯期保證在C的“源代碼”里面,沒有對其修飾的變量進行修改的地方(如有則報錯,編譯不通過),而運行期該變量的值是否被改變則不受const的限制。

(2)volatile在編譯期和運行期都有用

在編譯期告訴編譯器:請不要做自以為是的優化,這個變量的值可能會變掉;

在運行期:每次用到該變量的值,都從內存中取該變量的值。

補充:編譯期 -- C編譯器將源代碼轉化為匯編,再轉化為機器碼的過程;運行期 -- 機器碼在CPU中執行的過程。

三,const, volatile同時修飾一個變量

(1)合法性

“volatile”的含義并非是“non-const”,volatile和cons不構成反義詞,所以可以放一起修飾一個變量。

(2)同時修飾一個變量的含義

表示一個變量在程序編譯期不能被修改且不能被優化;在程序運行期,變量值可修改,但每次用到該變量的值都要從內存中讀取,以防止意外錯誤。

7 、棧、堆、靜態存儲區

棧:主要函數調用的使用

棧是從高地址向低地址方向使用,堆的方向相反。

在一次函數調用中,棧中將被依次壓入:參數,返回地址,EBP。如果函數有局部變量,接下來,就在棧中開辟相應的空間以構造變量。

在C語言程序中,參數的壓棧順序是反向的。比如func(a,b,c)。在參數入棧的時候,是:先壓c,再壓b,最后a。在取參數的時候,由于棧的先入后出,先取棧頂的a,再取b,最后取c。

堆:主要內存動態分配

空閑鏈表法,位圖法,對象池法等等 。

Int* p=(int*)malloc(sizeof(int));

靜態存儲區:保存全局變量和靜態變量

程序靜態存儲區隨著程序的運行而分配空間,直到程序運行結束,在程序的編譯期靜態存儲區的大小就已經確定,程序的靜態存儲區主要用于保存程序中的全局變量和靜態變量與棧和堆不同,靜態存儲區的信息最終會保存到可執行程序中 。

知識點:堆棧段在程序運行后才正式存在,是程序運行的基礎

1.函數放在代碼段:.Test section。 .text段存放的是程序中的可執行代碼

2.帶初始值的全局變量和靜態變量在數據段:.data section。 .data段保存的是那些已經初始化了的全局變量和靜態變量

3.不帶初始值得全局變量和靜態變量在.bss。 .bss段存放的是未初始化的全局變量和靜態變量

.rodata(read only)段存放程序中的常量值,如字符串常量

同是全局變量和靜態變量,為什么初始化和未初始化的變量保存在不同的段中?

答:為了啟動代碼的簡單化,編譯鏈接器會把已初始化的變量放在同一個段:.data,這個段的映像(包含了各個變量的初值)保存在“只讀數據段”,這樣啟動代碼就可以簡單地復制這個映像到 .data 段,所有的已初始化變量就都初始化了。而未初始化變量也放在同一個段:.bss,啟動代碼簡單地調用 memset 就可以把所有未初始化變量都清0。

void *memset(void *s, int ch, size_t n);

函數解釋:將s中當前位置后面的n個字節 (typedef unsigned int size_t )用 ch 替換并返回 s 。

memset:作用是在一段內存塊中填充某個給定的值,它是對較大的結構體或數組進行清零操作的一種最快方法

#define Malloc(type,n) (type*)malloc(n*sizeof(type))

8 、野指針

產生原因:

1、局部指針變量沒有初始化

2、使用已經釋放的指針

3、指針所指向的變量在指針之前被銷毀

A.用malloc申請了內存之后,應該立即檢查指針值是否為NULL,防止使用為NULL的指針:

B.牢記數組的長度,防止數組越界操作,考慮使用柔性數組

C.動態申請操作必須和釋放操作匹配,防止內存泄露和多次釋放

D.free指針之后必須立即賦值為NULL

9 、void類型指針

指針有兩個屬性:指向變量/對象的地址和長度,但是指針只存儲地址,長度則取決于指針的類型;編譯器根據指針的類型從指針指向的地址向后尋址,指針類型不同則尋址范圍也不同,比如:

int*從指定地址向后尋找4字節作為變量的存儲單元

double*從指定地址向后尋找8字節作為變量的存儲單元

void即“無類型”,void *則為“無類型指針”,可以指向任何數據類型。

void指針可以指向任意類型的數據,即可用任意數據類型的指針對void指針賦值。例如

int *pint;

void *pvoid; //它沒有類型,或者說這個類型不能判斷出指向對象的長度

pvoid = pint; //只獲得變量/對象地址而不獲得大小,但是不能 pint =pvoid;

9.2 如果要將pvoid賦給其他類型指針,則需要強制類型轉換如:

pint = (int *)pvoid; //轉換類型也就是獲得指向變量/對象大小

9.3 void指針不能復引用(即取內容的意思)

*pvoid //錯誤

要想復引用一個指針,或者使用“->”運算符復引用一部分,都要有對于指針指向的內存的解釋規則。

例如,int *p;

那么,當你后面復印用p的時候,編譯器就會把從p指向的地址開始的四個字節看作一個整數的補碼。

因為void指針只知道指向變量/對象的起始地址,而不知道指向變量/對象的大小(占幾個字節)所以無法正確引用。

在實際的程序設計中,為迎合ANSI標準,并提高程序的可移植性,我們可以這樣編寫實現同樣功能的代碼:

void*pvoid;

(char*)pvoid++; //ANSI:正確;GNU:正確

(char*)pvoid+=1; //ANSI:錯誤;GNU:正確

上一篇:Java面試題(附答案)

下一篇:嵌入式C語言面試題大集合,都是自己總結的

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

回到頂部

主站蜘蛛池模板: 河北高新技术企业认定,沧州商标注册,沧州9001质量管理体系认证,沧州高新技术企业认定,沧州体系认证,沧州商标续展,沧州版权登记,河北国瑞企业管理咨询有限公司 | 石英砂过滤器_砂滤器_石家庄工泉水处理科技有限公司 | 三机一体除湿干燥机,色母机,称重式拌料机,工业冻水机,中央集中供料-东莞市瑞达机械科技有限公司(瑞达国际) | 校园防欺凌|视频一键式报警器|防霸凌报警柱|停车场语音对讲|商铺联网报警|应急广播音柱|居家养老一键通|盾王可视联网运营中心 | 物联网环控器-智能养殖监控系统-智能化养殖控制器-养殖环境控制器-朗锐恒科技 | 皮带输送机-宁津县浩发链条有限公司| 庭院大门,铝艺大门厂家,别墅庭院大门「免费设计」汉兰达庭院门厂家 | 亚洲一区日韩一区欧美一区a,中文字幕乱妇无码AV在线,欧美日韩免费在线观看,国产精品一区二区三区免费,日韩精品免费一线在线观看,日韩一本在线,国产呦精品一区二区三区下载,国产日韩精品一区二区在线观看,欧美日韩高清一区二区三区,日韩在线免费观看视频,欧美日韩一区在线观看 | 三原图库 - 设计图片素材打包下载sytuku.com | 普利塞HS穿刺活检针-巴德穿刺活检针-美创爱琅Argon活检针同轴针-山东瑞玺源 | 消字号牙膏代加工|面膜代加工|凝胶贴牌|漱口水贴牌-南京三盾药业有限公司-消字号牙膏代加工|面膜代加工|凝胶贴牌|漱口水贴牌-南京三盾药业有限公司 | 四通球阀_304真空阀_不锈钢五通球阀厂家-浙江壬丰阀门有限公司 | 临淄信息港 - 免费发布房产、招聘、求职、二手、商铺等信息 www.lzzl.net | 扬州市德友线缆有限公司-业从事高端特种线缆研发、制造、销售与服务。 | 仪商网-专业测试仪器,测量仪表行业信息综合门户 | 合肥发斯特精密塑模有限公司专业精密磨具,注塑模具,精密注塑机械零件(加工制造|生产|销售|厂家) 浩通集团 国际货运 物贸一体化 中非经贸 | 日职联直播_日职联免费视频直播_日职联直播在线观看无插件-24直播网 | 合肥发斯特精密塑模有限公司专业精密磨具,注塑模具,精密注塑机械零件(加工制造|生产|销售|厂家) 浩通集团 国际货运 物贸一体化 中非经贸 | 上海同田生物技术有限公司-逆流色谱供应商和应用技术服务商 | 阻垢剂|缓蚀剂|杀菌剂|分散剂|水处理剂|印染助剂|水处理药剂|造纸助剂|膜阻垢剂|缓蚀剂|HEDP|ATMP|螯合剂-山东凯瑞化学有限公司 水处理药剂生产厂家 | 连续式回转炉_间歇式回转炉_燃气式回转炉_电加热回转炉-长兴博达机械配件有限公司 | 威海牙科,威海种植牙,威海人工种植牙-威海经济开发区姚晓艺口腔诊所 | 私人家庭影院装修_别墅家庭影院设计_家庭影院价格方案-广州家庭影院定制公司 | 苏州妙凯电子有限公司-供应军工电源芯片|线性恒流IC|开关电源IC|LED驱动芯片|MOS管|IPM|IGBT|MCU开发|电源模块 | 英格索兰空压机_英格索兰空压机配件_英格索兰空压机维修—商天机械 | 种植槽系统,移动苗床,多层种植货架,潮汐苗床,物流苗床,潮汐面板,立体旋转育秧床,河北博超温室设备有限公司 | 气瓶探伤设备-气瓶在线离线无损探伤检测系统-中高低压力容器超声波自动探伤设备-山科飞泰 | 陶瓷透水砖-透水砖厂家-淄博天之润生态科技有限公司 | 中国建材信息总网-中国建材行业权威的信息资讯平台 | 商标转让_商标买卖交易平台_商标转让注册网站-世标网 | 清河县隆鑫密封件有限公司,汽车用密封条,配电箱柜、集装箱密封胶条,建筑门窗、家具用密封条,无毒环保医用密封条,船舶、农机用密封条,异型产品 | 潍坊沃林机械设备有限公司-牵引式风送果园打药机,悬挂式风送果园喷雾机,自走式果树喷药机,车载式风送远程喷雾机-潍坊沃林机械设备有限公司-牵引式风送果园打药机,悬挂式风送果园喷雾机,自走式果树喷药机,车载式风送远程喷雾机 潍坊网络推广,临沂360推广,东营360推广,枣庄360推广,潍坊网站建设,潍坊网络公司,潍坊360搜索,潍坊APP开发,潍坊360推广,潍坊360代理,潍坊点睛网络科技有限公司 | 新2025澳门天天开好彩生肖对照表,2025新澳精准正版免费,2025新澳今晚开奖资料大全,新澳门四肖期期准免费,新澳门今晚9点30分开奖结果 | 耐磨锤头|合金锤头|高铬耐磨锤头|破碎机锤头|双金属双液复合锤头_巩义东辰实业 合金耐磨锤头铸造厂 | 上海瀚广科技(集团)有限公司,上海瀚广,瀚广 | 山东腾达源金属材料官网-耐磨板nm400,nm400耐磨钢板,nm500耐磨钢板切割,耐候板批发,高强板现货【价格】 | 潍坊沃林机械设备有限公司-牵引式风送果园打药机,悬挂式风送果园喷雾机,自走式果树喷药机,车载式风送远程喷雾机-潍坊沃林机械设备有限公司-牵引式风送果园打药机,悬挂式风送果园喷雾机,自走式果树喷药机,车载式风送远程喷雾机 潍坊网络推广,临沂360推广,东营360推广,枣庄360推广,潍坊网站建设,潍坊网络公司,潍坊360搜索,潍坊APP开发,潍坊360推广,潍坊360代理,潍坊点睛网络科技有限公司 | 转轮除湿机,转轮除湿机,恒温恒湿机厂家_合肥铂克环境设备有限公司 | 江苏苏仪集团有限公司 江苏红光仪表厂有限公司 | 轻型防化服|重型防化服|全封闭防化服|济南三安安全防护设备有限公司 | 随州网站建设_随州建站公司_随州SEO优化排名_随州网络公司-随州市金思维网络科技有限公司 |