11、
下面的**輸出是什麼,為什麼?
void foo(void)
不管如何,這無符號整型問題的答案是輸出是
「>6」
。原因是當表示式中存在有符號型別和無符號型別時所有的運算元都自動轉換為無符號型別。因此
-20變成了乙個非常大的正整數,所以該表示式計算出的結果大於
6。這一點對於應當頻繁用到無符號資料型別的嵌入式系統來說是丰常重要的。
12、評價下面的**片斷:
unsigned int zero = 0;
unsigned int compzero = 0xffff;
/*1's complement of zero */
對於乙個
int型不是
16位的處理器為說,上面的**是不正確的。應編寫如下:
unsigned int compzero = ~0;
這一問題真正能揭露出應試者是否懂得處理器字長的重要性。好的嵌入式
程式設計師非常準確地明白硬體的細節和它的侷限。
13、儘管不像非嵌入式計算機那麼常見,嵌入式系統還是有從堆(
heap
)中動態分配記憶體的過程的。那麼嵌入式系統中,動態分配記憶體可能發生的問題是什麼?
這裡,應試者能提到記憶體碎片,碎片收集的問題,變數的持行時間等等。
下面的**片段的輸出是什麼,為什麼?
char *ptr;
if ((ptr = (char *)malloc(0)) == null)
puts("got a null pointer");
else
puts("got a valid pointer");
這是乙個有趣的問題,不經意把
0值傳給了函式
malloc
,得到了乙個合
法的指標之後,該**的輸出是
「got a valid
pointer」
。用這個來開始討論這樣的一問題,看看被面試者是否想到庫例程這樣做是正確。
14、 typedef 在c
語言中頻繁用以宣告乙個已經存在的資料型別的同義字。也可以用預處理
器做類似的事。例如,思考一下下面的例子:
#define dps struct s *
typedef struct s * tps;
以上兩種情況的意圖都是要定義
dps
和tps
作為乙個指向結構
s指標。哪種方法更好呢?
為什麼?
答案是:
typedef
更好。思考下面的例子:
dps p1,p2;
tps p3,p4;
第乙個擴充套件為
struct s * p1, p2;
上面的**定義
p1為乙個指向結構的指,
p2為乙個實際的結構,這也許不是你想要的。第
二個例子正確地定義了
p3 和
p4 兩個指標。
15、c
語言同意一些令人震驚的結構
,下面的結構是合法的嗎,如果是它做些什麼?
int a = 5, b = 7, c;
c = a+++b;
上面的例子是完全合乎語
法的。問題是編譯器如何處理它?根據最處理
原則,編譯器應當能處理盡可能所有合法的用法。因此,上面的**被處理成:
c = a++ + b;
因此,
這段**持行後
a = 6, b = 7, c = 12
。
嵌入式C語言面試題(二)
1 讀程式段,回答問題 int main int argc,char argv 複製 a 寫出程式輸出 b 在乙個可移植的系統中這種表示式是否存在風險?why?include stdio.h int a 0 int b static char c int main int argc,char arg...
嵌入式C語言面試題(二)
1 讀程式段,回答問題 int main int argc,char argv a 寫出程式輸出 b 在乙個可移植的系統中這種表示式是否存在風險?why?include stdio.h int a 0 int b static char c int main int argc,char argv a...
嵌入式C語言面試題
1 讀程式,回答問題 int main int argc,char argv a 寫出程式的結果 b 在乙個可移植的系統中這種表示式是否存在風險?why?答 a 4 b 存在風險,因為c c 5 在這個表示式中,對c有兩次修改,行末未定義,c的值不明確。2 include stdio.h int a...