姓名:朱軍偉? ? ? ? ? ? ? ?學(xué)號:19170100001? ? ? ? ? ?學(xué)院:電子工程學(xué)院? ? ? ? ? ? 班級:1902015
原文轉(zhuǎn)自:https://download.csdn.net/download/sun_jfly/4326176?utm_medium=distribute.pc_relevant_t0.none-task-download-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-1.control&depth_1-utm_source=distribute.pc_relevant_t0.none-task-download-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-1.control
【嵌牛導(dǎo)讀】任何行業(yè)的終極目標(biāo)都是為了謀求發(fā)展,嵌入式作為一個前沿行業(yè),我們有必要熟悉一下常見的面試題,我將此作為一個系列發(fā)布。
【嵌牛鼻子】嵌入式行業(yè)面試題
【嵌牛提問】如何輕松應(yīng)對嵌入式行業(yè)面試?
【嵌牛正文】
1.請問以下代碼有什么問題:
int main()
{
char a;char *str=&a;
strcpy(str,"hello");
printf(str);
return 0;
}
沒有為 str 分配內(nèi)存空間,將會發(fā)生異常
問題出在將一個字符串復(fù)制進(jìn)一個字符變量指針?biāo)傅刂?。雖然可以正確輸出結(jié)果,但因為
越界進(jìn)行內(nèi)在讀寫而導(dǎo)致程序崩潰。
char* s="AAA";
printf("%s",s);
s[0]='B';
printf("%s",s);
有什么錯?
"AAA"是字符串常量。s 是指針,指向這個字符串常量,所以聲明 s 的時候就有問題。
cosnt char* s="AAA";
然后又因為是常量,所以對是 s[0]的賦值操作是不合法的。
1、寫一個“標(biāo)準(zhǔn)”宏,這個宏輸入兩個參數(shù)并返回較小的一個。
.#define Min(X, Y) ((X)>(Y)?(Y):(X))//結(jié)尾沒有;
2、嵌入式系統(tǒng)中經(jīng)常要用到無限循環(huán),你怎么用 C 編寫死循環(huán)。
while(1){}或者 for(;;)
3、關(guān)鍵字 static 的作用是什么?
定義靜態(tài)變量
4、關(guān)鍵字 const 有什么含意?
表示常量不可以修改的變量。
5、關(guān)鍵字 volatile 有什么含意?并舉出三個不同的例子?
提示編譯器對象的值可能在編譯器未監(jiān)測到的情況下改變。
int (*s[10])(int) 表示的是什么啊
int (*s[10])(int) 函數(shù)指針數(shù)組,每個指針指向一個 int func(int param)的函數(shù)。
1.有以下表達(dá)式:
int a=248; b=4;int const c=21;const int *d=&a;
int *const e=&b;int const *f const =&a;
請問下列表達(dá)式哪些會被編譯器禁止?為什么?
*c=32;d=&b;*d=43;e=34;e=&a;f=0x321f;
*c 這是個什么東東,禁止
*d 說了是 const, 禁止
e = &a 說了是 const 禁止
const *f const =&a; 禁止
2.交換兩個變量的值,不使用第三個變量。即 a=3,b=5,交換之后 a=5,b=3;有兩種解法, 一種用算術(shù)算法, 一種用^(異或)
a = a + b;
b = a - b;
a = a - b;
or
a = a^b;// 只能對 int,char..
b = a^b;
a = a^b;
or
a ^= b ^= a;
3.c 和 c++中的 struct 有什么不同?
c 和 c++中 struct 的主要區(qū)別是 c 中的 struct 不可以含有成員函數(shù),而 c++中的 struct 可以。
c++中 struct 和 class 的主要區(qū)別在于默認(rèn)的存取權(quán)限不同,struct 默認(rèn)為 public,而 class 默
認(rèn)為 private
4.#include <stdio.h>
#include <stdlib.h>
void getmemory(char *p)
{
p=(char *) malloc(100);
strcpy(p,"hello world");
}
int main( )
{
char *str=NULL;
getmemory(str);
printf("%s/n",str);
free(str);
return 0;
}
程序崩潰,getmemory 中的 malloc 不能返回動態(tài)內(nèi)存, free()對 str 操作很危險
5.char szstr[10];
strcpy(szstr,"0123456789");
產(chǎn)生什么結(jié)果?為什么?
長度不一樣,會造成非法的 OS
6.列舉幾種進(jìn)程的同步機(jī)制,并比較其優(yōu)缺點(diǎn)。
原子操作
信號量機(jī)制
自旋鎖
管程,會合,分布式系統(tǒng)
7.進(jìn)程之間通信的途徑
共享存儲系統(tǒng)
消息傳遞系統(tǒng)
管道:以文件系統(tǒng)為基礎(chǔ)11.進(jìn)程死鎖的原因
資源競爭及進(jìn)程推進(jìn)順序非法
12.死鎖的 4 個必要條件
互斥、請求保持、不可剝奪、環(huán)路
13.死鎖的處理
鴕鳥策略、預(yù)防策略、避免策略、檢測與解除死鎖
15. 操作系統(tǒng)中進(jìn)程調(diào)度策略有哪幾種?
FCFS(先來先服務(wù)),優(yōu)先級,時間片輪轉(zhuǎn),多級反饋
8.類的靜態(tài)成員和非靜態(tài)成員有何區(qū)別?
類的靜態(tài)成員每個類只有一個,非靜態(tài)成員每個對象一個
9.純虛函數(shù)如何定義?使用時應(yīng)注意什么?
virtual void f()=0;
是接口,子類必須要實現(xiàn)
10.數(shù)組和鏈表的區(qū)別
數(shù)組:數(shù)據(jù)順序存儲,固定大小
連表:數(shù)據(jù)可以隨機(jī)存儲,大小可動態(tài)改變
12.ISO 的七層模型是什么?tcp/udp 是屬于哪一層?tcp/udp 有何優(yōu)缺點(diǎn)?
應(yīng)用層
表示層
會話層
運(yùn)輸層
網(wǎng)絡(luò)層
物理鏈路層
物理層
tcp /udp 屬于運(yùn)輸層
TCP 服務(wù)提供了數(shù)據(jù)流傳輸、可靠性、有效流控制、全雙工操作和多路復(fù)用技術(shù)等。
與 TCP 不同, UDP 并不提供對 IP 協(xié)議的可靠機(jī)制、流控制以及錯誤恢復(fù)功能等。由于
UDP 比較簡單, UDP 頭包含很少的字節(jié),比 TCP 負(fù)載消耗少。
tcp: 提供穩(wěn)定的傳輸服務(wù),有流量控制,缺點(diǎn)是包頭大,冗余性不好
udp: 不提供穩(wěn)定的服務(wù),包頭小,開銷小
1:(void *)ptr 和 (*(void**))ptr 的結(jié)果是否相同?其中 ptr 為同一個指針
.(void *)ptr 和 (*(void**))ptr 值是相同的
2:int main()
{
int x=3;
printf("%d",x);
return 1;
}
問函數(shù)既然不會被其它函數(shù)調(diào)用,為什么要返回 1?
mian 中,c 標(biāo)準(zhǔn)認(rèn)為 0 表示成功,非 0 表示錯誤。具體的值是某中具體出錯信息1,要對絕對地址 0x100000 賦值,我們可以用
(unsigned int*)0x100000 = 1234;
那么要是想讓程序跳轉(zhuǎn)到絕對地址是 0x100000 去執(zhí)行,應(yīng)該怎么做?
*((void (*)( ))0x100000 ) ( );
首先要將 0x100000 強(qiáng)制轉(zhuǎn)換成函數(shù)指針,即:
(void (*)())0x100000
然后再調(diào)用它:
*((void (*)())0x100000)();
用 typedef 可以看得更直觀些:
typedef void(*)() voidFuncPtr;
*((voidFuncPtr)0x100000)();
2,已知一個數(shù)組 table,用一個宏定義,求出數(shù)據(jù)的元素個數(shù)
#define NTBL
#define NTBL (sizeof(table)/sizeof(table[0]))
面試題: 線程與進(jìn)程的區(qū)別和聯(lián)系? 線程是否具有相同的堆棧? dll 是否有獨(dú)立的堆棧?
進(jìn)程是死的,只是一些資源的集合,真正的程序執(zhí)行都是線程來完成的,程序啟動的時候操
作系統(tǒng)就幫你創(chuàng)建了一個主線程。
每個線程有自己的堆棧。
DLL 中有沒有獨(dú)立的堆棧,這個問題不好回答,或者說這個問題本身是否有問題。因為 DLL
中的代碼是被某些線程所執(zhí)行,只有線程擁有堆棧,如果 DLL 中的代碼是 EXE 中的線程所調(diào)
用,那么這個時候是不是說這個 DLL 沒有自己獨(dú)立的堆棧?如果 DLL 中的代碼是由 DLL 自己
創(chuàng)建的線程所執(zhí)行,那么是不是說 DLL 有獨(dú)立的堆棧?
以上講的是堆棧,如果對于堆來說,每個 DLL 有自己的堆,所以如果是從 DLL 中動態(tài)分配的
內(nèi)存,最好是從 DLL 中刪除,如果你從 DLL 中分配內(nèi)存,然后在 EXE 中,或者另外一個 DLL
中刪除,很有可能導(dǎo)致程序崩潰
unsigned short A = 10;
printf("~A = %u\n", ~A);
char c=128;
printf("c=%d\n",c);
輸出多少?并分析過程
第一題,~A =0xfffffff5,int 值 為-11,但輸出的是 uint。所以輸出 4294967285
第二題,c=0x10,輸出的是 int,最高位為 1,是負(fù)數(shù),所以它的值就是 0x00 的補(bǔ)碼就是 128,
所以輸出-128。
這兩道題都是在考察二進(jìn)制向 int 或 uint 轉(zhuǎn)換時的最高位處理。分析下面的程序:
void GetMemory(char **p,int num)
{
*p=(char *)malloc(num);
}
int main()
{
char *str=NULL;
GetMemory(&str,100);
strcpy(str,"hello");
free(str);
if(str!=NULL)
{
strcpy(str,"world");
}
printf("\n str is %s",str);
getchar();
}
問輸出結(jié)果是什么?希望大家能說說原因,先謝謝了
輸出 str is world。
free 只是釋放的 str 指向的內(nèi)存空間,它本身的值還是存在的.
所以 free 之后,有一個好的習(xí)慣就是將 str=NULL.
此時 str 指向空間的內(nèi)存已被回收,如果輸出語句之前還存在分配空間的操作的話,這段存儲
空間是可能被重新分配給其他變量的,
盡管這段程序確實是存在大大的問題(上面各位已經(jīng)說得很清楚了),但是通常會打印出
world 來。
這是因為,進(jìn)程中的內(nèi)存管理一般不是由操作系統(tǒng)完成的,而是由庫函數(shù)自己完成的。
當(dāng)你 malloc 一塊內(nèi)存的時候,管理庫向操作系統(tǒng)申請一塊空間(可能會比你申請的大一些),
然后在這塊空間中記錄一些管理信息(一般是在你申請的內(nèi)存前面一點(diǎn)),并將可用內(nèi)存的
地址返回。但是釋放內(nèi)存的時候,管理庫通常都不會將內(nèi)存還給操作系統(tǒng),因此你是可以繼
續(xù)訪問這塊地址的,只不過。。。。。。。。樓上都說過了,最好別這么干