2020屆校招大疆嵌入式部分筆試題

 在32位系統中有如下定義,則sizeof(data_t)的值是()

    typedef struct data{
        char m:3;
        char n:5;
        short s;
        union{
            int a;
            char b;
        };
        int h;
    }__attribute__((packed)) data_t;

sizeof(data_t) = 11;
__attribute__((packed))的作用就是告訴編譯器取消結構在編譯過程中的優化對齊,按照實際佔用字節數對齊,union聯合體裏面的變量是共享一個地址空間的,以及結構體的位段操作知識點。

參考博客:

__attribute__((packed))詳解

結構體、位段與聯合體

程序按64位編譯,運行下列程序代碼,打印輸出結果是多少

#define CALC(x,y)  (x*y)

int main(void) { 
    int i=3;
    int calc;
    char **a[5][6];

	calc = CALC(i++, sizeof(a)+5);
	printf("i=%d, calc=%d\n", i, calc);
	return 0;
}

輸出結果爲:i=4, calc=725

注意在宏定義中帶參數時括號的用法,在本題中#define CALC(x, y)    (x*y)的結果是725,但是如果這樣寫:#define  CALC(x,y)  (x)*(y) 的結果就是735

一般32位機器就是5*6*4 = 120,64位則是5*6*8=240 ,char *a是字符型指針,char **a是指針的指針,在64位和32位中指針的大小是不一樣的

參考博客:

帶參數的宏定義

Linux系統中內核線程和普通線程的區別

普通線程和內核線程

內核線程和用戶線程

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章