嵌入式軟件測試題(C語言)V1.0
嵌入式軟件測試題(C語言)V1.0
以下50個選擇題,每題都可能存在一個或多個正確答案,請找出所有正確答案填在每題對應的括號中。多選、錯選、漏選或不選,均不得分。每題2分。總計100分。
為了縮短篇幅和節約大家的時間,試題中的代碼可能不是完整的代碼,答題時請不用考慮代碼是否具有可編譯和可執行性,僅分析代碼本身即可。
1、定義一個數組int a[2] = {1,3},那麽a的值是( D )
A、0; B、1; C、3; D、不能確定;
2、有如下代碼:
float a = 123.45678;
if(123.45678 == a)
{
printf(“a = 123.45678”);
}
else if(123.45678 > a)
{
printf(“a > 123.45678”);
}
else if(123.45678 < a)
{
printf(“a < 123.45678”);
}
else
{
printf(“不能確定”);
}
請問上述代碼輸出的結果有可能是( ABC )
A、a = 123.45678; B、a > 123.45678; C、a < 123.45678; D、不能確定;
3、在一臺32位的PC上運行下述代碼,結果可能是( C )
int *a = NULL;
char b[8] = {0};
printf(“sizeof(a) = %d,sizeof(b) = %d”, sizeof(a),sizeof(b));
A、sizeof(a) = 2,sizeof(b) = 2; B、sizeof(a) = 4,sizeof(b) = 4;
C、sizeof(a) = 4,sizeof(b) = 8; D、sizeof(a) = 8,sizeof(b) = 8;
4、下述代碼運行後,哪些值可以是變量X的值( AC )
X = Y ^ 0x80;
X = X & 0xF0;
A、0xF0; B、0x0F; C、160; D、112
5、下述代碼運行後,哪些值可以是變量R的值( BCD )
int a;
…… /*此處忽略若幹代碼*/
R = (a+1) % 0xABCD;
A、0xABCD; B、0; C、256; D、1024;
6、代碼“const int a[2] ={5, 2};”中const的作用是( BD )
A、修飾a; B、修飾{5, 2};
C、說明a是只讀的; D、說明數組a中存儲的內容是只讀的;
7、關鍵字“NULL”的含義是( C )
A、未初始化的指針; B、未定義的指針;
C、空指針; D、整型的“0”;
8、下述代碼可能的作用是( C )
int a,b;
…… /*此處忽略若幹代碼*/
a = a ^ b;
b = a ^ b;
a = a ^ b;
A、求a、b的和; B、判斷a、b的大小關系;
C、交換a、b的值; D、加密a、b的值;
9、如果在一個大字節序(大端)的32位系統中定義變量:“unsigned long testCpuArchitecture = 0x12345678;”,那麽“*(unsigned char*)&testCpuArchitecture”的值應該是( A )
A、0x12; B、0x34; C、0x56; D、0x78
10、在一個32位的系統中有下述代碼,則sizeof(A_BIT_T)和sizeof(bitMap)的值分別是( B )
typedef unsigned char uint8;
typedef struct{
uint8 bit : 1;
}A_BIT_T;
A_BIT_T bitMap[16] = {0};
A、1,2; B、1,16; C、4,2; D、4,16;
11、一個指針的定義為:“char *ptr = NULL;”,則下列表述正確的有( AB )
A、指針所指向的內容可以被修改;
B、指針本身的值是可以被修改的;
C、指針本身所在的地址可以被修改;
D、指針只能指向一個存放了字符的存儲位置;
12、一個函數如果沒有“return”語句,那麽這個函數將( D )
A、一直無限循環運行; B、可能在任意一句語句處退出;
C、隨時可能崩潰; D、運行完成後退出;
13、宏定義的特點有( ABD )
A、可以被多個函數調用; B、可能存在副作用;
C、運行效率比定義函數高; D、多次調用後占用的代碼存儲空間比函數多;
14、在一個“while”循環中,允許使用“break”和“continue”的數量是( D )
A、兩者只能使用一個,每個只能使用一次;
B、break可以使用多次,continue只能一次;
C、break只能使用一次,continue可以多次;
D、兩者均不限次數;
15、以下是static關鍵字的作用的有( ABC )
A、修飾局部變量,表示此變量只能在當前函數內部被訪問,其存儲在堆和棧之外;
B、修飾函數,表示此函數只能在當前文件內部被訪問;
C、修飾全局變量,表示此變量只能在當前文件內部被訪問;
D、修飾函數的入參,表示此入參是只讀的,不可被修改;
16、下列代碼運行結束後,i的值是( B )
int i = 1;
switch(i)
{
case 0:
i++;
break;
case 1:
++i;
case 3:
i++;
break;
case 4:
i++;
default:
++i;
}
A、2 B、3 C、4 D、5
17、在一個32位的系統中有如下定義,則sizeof(U)的值是( C )
union {
char c;
char *p;
}U;
A、1 B、2 C、4 D、8
18、“野指針”是( BD )
A、未定義的指針; B、沒有被賦值的指針;
C、指向的地址確定,但其中的內容是未知的; D、指向的地址是不確定的指針;
19、頭文件中的ifndef…define…endif的作用是( B )
A、說明這是一個頭文件;
B、防止被重復包含;
C、優化頭文件,使其占用更少的存儲空間;
D、定義頭文件的名稱,以便被引用;
20、下列代碼,哪幾行是編譯時有錯誤或運行時會發生異常的( C )
1:char a;
2:char *str=&a;
3:strcpy(str,"hello");
4:printf(str);
A、第1行; B、第2行; C、第3行; D、第4行;
21、為什麽將結構體數據傳遞到函數內部時,建議函數的入參使用結構體指針而不是結構體( BD )
A、節省堆; B、節省棧; C、節省代碼量; D、運行效率更高;
22、在32位的系統中有一個雙向鏈表,每個鏈表成員存放三個字符信息,則一個鏈表成員至少需要占用幾個字節的存儲空間( C )
A、3; B、9; C、12; D、18
23、可用於實現循環隊列的數據結構可以是( BC )
A、平衡二叉樹; B、數組; C、雙向鏈表; D、無沖突HASH表
24、在數據成員個數較多且數據內容較隨機的情況下,查找一個成員的平均效率最高的數據結構是( D )
A、平衡二叉樹; B、數組; C、雙向鏈表; D、無沖突HASH表
25、最後進入棧的數據存放在棧的( A )
A、頂部; B、中部; C、底部; D、可以是任意位置;
26、假設a = 100,b = 1000,則下面兩個for循環,哪個效率更高( A )
甲:
for(i=0; i<a; i++)
{
for(k=0; k<b; k++)
{
printf(“i=%d, k=%d\n”, i, k);
}
}
乙:
for(i=0; i<b; i++)
{
for(k=0; k<a; k++)
{
printf(“i=%d, k=%d\n”, i, k);
}
}
A、甲; B、乙; C、一樣; D、無法確定;
27、FIFO的特點有( B )
A、FIFO滿的時候,會導致成員數據錯亂;
B、最先進入的成員最先出來;
C、FIFO空的時候,其內部所有存儲單元的值都是0;
D、它和棧是等效的;
28、常見的排序算法有( AB )
A、冒泡法; B、插入法; C、遍歷法; D、倒序法;
29、在一個有1000個成員的整型數組中,其成員都是按從小到大排列的,則平均來看查找是否存在某一個值的最快算法是( C )
A、遍歷法; B、隨機法; C、二分法; D、倒序法;
30、如果一個事件需要在同時滿足5個條件的情況下才會運行,則在使用形如:
if(a && b && c && d && e)
{
…….//待執行語句;
}
的語句時,應該將這5個條件按照什麽順序放置。( A )
A、發生概率從低到高排列; B、發生概率從高到低排列;
C、隨機放置; D、發生概率中等的放在最前面;
31、以下屬於枚舉特點的是( AB )
A、可以定義成一種數據類型; B、枚舉值必須是整數;
C、枚舉值必須是連續的; D、枚舉和宏定義是一樣的;
32、如果一段正常的代碼中出現了一個多余的分號,形如:
jar = QUART;
printf("%d,", jar);
jar = jar + PINT;
;
printf("%d\n", jar);
則這段代碼會( D )
A、無法編譯通過; B、能編譯通過,但不能運行;
C、能編譯通過,但運行時可能程序會崩潰; D、無任何影響;
33、有如下一段代碼,即在if語句的後面多了一個分號,那麽( CD )
if(a && b) ;
{
printf(“hello word!\n”);
}
A、不論a、b是何值,都不會打印出“helloword!”; B、無法編譯通過;
C、不論a、b是何值,都會打印出“helloword!”; D、能編譯通過;
34、下面的代碼存在的問題是( BC )
char a = 0;
char *p;
while(a < = 255)
{
p = malloc(100);
……
a++;
}
free(p);
p = NULL;
A、存在野指針; B、存在內存泄漏; C、存在死循環; D、沒有任何問題;
35、有如下代碼:
enum Liquid {OUNCE = 1,CUP = 2,PINT = 16,QUART = 32, GALLON = 128};
enum Liquid jar;
jar = QUART;
printf("%d,", jar);
jar = jar + PINT;
printf("%d\n", jar);
則打印出來的內容將會是( C )
A、32, 0; B、0, 0; C、32, 48; D、32, 隨機值;
36、下列代碼存在的問題有( C )
typedef struct DATA_MEMBER_S{
struct DATA_MEMBER_S *p_nest;
int a;
int b;
char c[4];
}DATA_MEMBER_T;
int main()
{
DATA_MEMBER_T d = {.p_nest = NULL, .a = 1, .b = 2, .c = "abcd"};
printf("%d, %d, %s\n",d.a, d.b, d.c);
}
A、結構體定義不正確; B、結構體初始化有誤;
C、打印語句可能會出錯; D、沒有任何問題;
37、一個函數( CD )
A、必須有入參; B、必須有返回值;
C、可以調用自己; D、返回值可以是另一個函數;
38、do{…}while()和while(){…}語句的特點有( ACD )
A、前者至少會執行一次{…}中的語句;
B、後者有可能會死循環,而前者不會;
C、兩個都可以使用break跳出;
D、兩者都可以使用continue語句;
39、以下是
for(statement1;statement2;statement3)
{
…/*循環主體*/
}
語句的特點的是( D )
A、statement1、statement2、statement3三個表達式不能同時為空;
B、for的運行效率比while高;
C、for循環主體不能使用break語句;
D、for循環主體可以使用continue語句;
40、以下說法正確的是( AB )
A、if…else…語句和switch…case…語句可以相互嵌套使用;
B、能使用switch語句的場景都可以用if…else…類的語句實現;
C、能使用if…else…類語句的場景都可以用switch語句實現;
D、在switch…case…語句主體中使用continue語句會跳轉到switch頭部重新開始執行;
41、在有N個進程的系統中,長時間平均來看每個進程的執行時間是( D )
A、1/N; B、1/2N; C、1/N2; D、不確定的
42、操作系統中進程“時間片輪轉”的作用是( C )
A、系統進程與應用進程輪流運行;
B、高優先級進程與低優先級進程輪流運行;
C、同優先級進程間輪流運行;
D、進程與中斷輪流運行;
43、跨進程全局資源共享時,可以用哪些方式進行保護( ABCD )
A、二進制信號量; B、計數制信號量;
C、關閉進程調度; D、關閉所有中斷;
44、創建一個進程時,必不可少的參數有( ABC )
A、進程可用的棧深度; B、進程優先級;
C、進程入口函數; D、進程的終止時間;
45、使用無“優先級繼承”機制的內核對象(比如普通二進制信號量)對全局資源進行保護時,可能會導致( B ),應該使用互斥鎖(mutex)。
A、不能有效保護數據完整性; B、進程優先級翻轉;
C、進程掛起; D、內核崩潰;
46、兩個進程間交互信息的方式可以有( ABC )
A、全局變量; B、信號量;
C、隊列或管道; D、中斷;
47、被掛起(suspend)的進程什麽時候才能恢復運行( B )
A、超時時間到了; B、被另一個進程或中斷喚起;
C、自動隨時喚起; D、等到其它進程都不運行的時候;
48、一個進程的棧空間溢出後可能會導致( A )
A、系統崩潰; B、進程掛起; C、進程被刪除; D、進程被重新啟動;
49、如果一個高優先級的進程進入了“死循環”,始終占據CPU不釋放,可能會導致( AB )
A、CPU使用率高; B、低優先級進程得不到運行;
C、中斷得不到執行; D、進程調度器會崩潰;
50、如果一個進程頻繁申請動態內存(比如使用malloc)而不釋放,可能會導致( ABD )
A、其它進程申請不到動態內存; B、本進程申請不到動態內存;
C、進程無法切換; D、動態內存耗盡;
嵌入式軟件測試題(C語言)V1.0