/***********************************************程式員面試寶典(第二版)******************************************************/
1.下列程式的輸出結果#include <stdio.h>int main(){printf("%f\n", 5);printf("%d\n", 5.01);}答:printf根據說明符%f,認為參數應該是個double型在printf函數中,float會自動轉換成doble,從stack中讀了8個位元組。記憶體越界,輸出0.000000第二個是一個大數2. 下面程式是否有錯?如果有,錯在哪裡?struct a{int x:1;int y:2;int z:33;};答:int z:33定義整形變數z為33位,也就是超過了4位元組會造成越界。3.Write a program that convert an octet number to a decimal number寫一個進位轉化成十進位數的程式。unsigned int oct2dec(unsigned int oct){return oct/10 * 8 + oct%10;}4.下面程式的運行結果是什嗎?#include <stdio.h>int main(){unsigned short int i = 0;int j = 8, p;p = j << 1;i = i-1;printf("p=%d, i = %d\n", p, i);}答:p = 8 << 1,左移1位乘以2的1次方為16unsigned short int 中無符號的-1結果是655355.記憶體中的資料排列問題#include <stdio.h>union {unsigned char a;//低地址unsigned int i;//高地址}u;int main(){u.i = 0x12345678;printf("u.a=%0x\n", u.a);}答:輸出u.a = 78,高位元組,低地址存高位元組6.嵌入式系統總是要使用者對變數或寄存器進行位操作,給定一個整型變數a寫兩份代碼,第一個設定a的bit 3, 第二個清除a的bit 3,在以上兩個操作中要保持其他位不變#define BIT3 (0x1 << 3)static int a ;void set_bit3(void){a |= BIT3;}void clear_bit3(void){a &=~BIT3;}7.寫出程式的運行結果#include <stdio.h>int main (){int *pa = NULL;int *pb = pa + 15;printf("%d\n", pb);return 0;}答:15 * 4 = 60在系統裡使用未初始化的指標是很危險的8. In embedded system, we usually use the keyword "volatile"what does the keyword mean?答:volatile修飾的是為了防止該變數被編譯器最佳化,編譯器每次都必須重新讀這個資料裡面的值。9. 關鍵字volatile有什麼含意?並給出3個不同的例子答:一個定義為volatile的變數是說這變數可能會被意想不到地改變最佳化器在用到這個變數時必須每次都小心地重新讀取這個變數的值,而不是使用儲存在寄存器裡的備份。1)平行裝置的硬體寄存器(狀態寄存器)2)一個中斷服務子程式中會訪問到的非自動變數3)多線程應用中被幾個任務共用的變數10. 一個參數可以是const又是volatile嗎?一個指標可以是volatile嗎?答:第一個問題是的,例子是唯讀狀態寄存器,它是volatile,因為它可能被意想不到地改變,它又是const,因為程式不應該試圖去修改它第二個問題:是的,中斷服務子程式修改一個指向一個buffer的指標11. 下面函數有什麼錯誤int square(volatile int *ptr){int a, b;a = *ptr;b = *ptr;return *ptr * *ptr;}答:由於*ptr的值可能被意想不到地改變,因此a和b可能是不同的。改正long square(volatile int *ptr){int a;a = *ptr;return a* a;}11. 寫一個C函數,若處理器是Big_endian的,則返回0,若是Little_endian的則返回1答:大端是:低地址低位元組小端是:低地址高位元組#include <stdio.h>int check_CPU(){union {int a;//低地址char b;}c;c.a = 1;//基中1為低位元組return (c.b == 1);//若返回1說明高地址放低位元組為小端,返回0為大端}