嵌入式筆試刷題專欄(第一天)
1.(void *)ptr和(*(void **))ptr的結(jié)果是否相同? 其中ptr為同一個指針
? 第 1 題:void *ptr
與 *(void **)ptr
有什么區(qū)別?
?? 考點: 指針類型轉(zhuǎn)換、void 指針用法
?? 易錯點: 誤以為 void*
可直接解引用
void *ptr;
是一個通用指針,指向任意類型,但不能直接解引用(沒有類型信息)。*(void **)ptr
:假設(shè)ptr
本身是一個void**
類型的變量,即ptr
指向一個void*
,可以解引用得到一個void*
。
?? 舉例:
void *a = malloc(4); void **b = &a; void *c = *b; // 相當(dāng)于 *(void **)b,沒問題 void *x = b; // 錯誤用法!x 是 void*,不能表示 void** void *y = *x; // 錯誤,void* 不能解引用
2.要對絕對地址0x100000賦值,我們可以用(unsigned int *)0x100000=1234; 那么要是想讓程序跳轉(zhuǎn)到絕對地址是0x100000去執(zhí)行,應(yīng)該怎么做?
? 第 2 題:如何跳轉(zhuǎn)到 0x100000
執(zhí)行一段程序?
?? 考點: 裸機(jī)開發(fā)、函數(shù)指針強(qiáng)制轉(zhuǎn)換
?? 在嵌入式中,經(jīng)常需要跳轉(zhuǎn)到特定 Flash/ROM 地址執(zhí)行,比如 OTA 升級、Bootloader 跳轉(zhuǎn)。
?? 寫法如下:
typedef void (*jump_func)(void); jump_func jump = (jump_func)0x100000; jump(); // 跳轉(zhuǎn)到 0x100000 處執(zhí)行
?? 注意:
- 必須確認(rèn)該地址有有效代碼,并且是可執(zhí)行段。
- 跳轉(zhuǎn)前可能要關(guān)閉中斷、重配置堆棧等。
3.給定結(jié)構(gòu)體
struct A
{
char t:4;
char k:4;
unsigned short i:8;
unsigned long m;
}; 問sizeof(struct A)是多少?
? 第 3 題:結(jié)構(gòu)體位域的 sizeof
?? 考點: 內(nèi)存對齊、位域填充
結(jié)構(gòu)體位域字段雖然按位分配,但實際大小依賴對齊規(guī)則。
?? 示例:
struct A { unsigned int a:1; unsigned int b:3; unsigned int c:2; }; std::cout << sizeof(A) << std::endl; // 輸出 4 或 8,依實現(xiàn)而異
- 一般位域按
int
對齊。 - 關(guān)鍵點:不能假設(shè)位域節(jié)省空間,需依賴編譯器布局策略。
4..int main()
{
}
? 第 4 題:空的 main()
函數(shù)會返回什么?
?? 考點: main 函數(shù)返回值
int main() { }
? 這其實是 UB(未定義行為),雖然一些編譯器會默認(rèn)補(bǔ)上 return 0;
,但標(biāo)準(zhǔn)要求返回值必須明確。
? 推薦:
int main() { return 0; }
5.編寫函數(shù)void hton(float val,char *buf)把小端序的val轉(zhuǎn)換成大端序的val,存放到buf中
? 第 5 題:實現(xiàn) hton(float)
?? 考點: 浮點數(shù)與字節(jié)序轉(zhuǎn)換
htonl
只能處理整數(shù)類型,如何將 float 進(jìn)行大端轉(zhuǎn)換?
?? 示例實現(xiàn):
float htonf(float val) {
剩余60%內(nèi)容,訂閱專欄后可繼續(xù)查看/也可單篇購買
本專欄系統(tǒng)整理了嵌入式方向筆試中常見的知識點和高頻考題,涵蓋基礎(chǔ)理論、常用算法、C語言陷阱、操作系統(tǒng)原理、驅(qū)動開發(fā)、常見外設(shè)通信協(xié)議(如 I2C/SPI/UART)、RTOS、Linux 內(nèi)核、以及實用電路知識等內(nèi)容。