嵌入式linux面試題解析(二) C語言部分三

2021-07-29 13:30:20 字數 4426 閱讀 5292

1、下面的程式會出現什麼結果

#include

#include

#include

void getmemory(char *p)

int main( )

程式崩潰,getmemory中的malloc 不能返回動態記憶體, free()對str操作很危險

2、(void *)ptr 和 (*(void**))ptr的結果是否相同?

答:ptr為同乙個指標

(void *)ptr 和 (*(void**))ptr值是相同的

3、對絕對位址0×100000賦值且想讓程式跳轉到絕對位址是0×100000去執行

(unsigned int*)0×100000 = 1234;

首先要將0×100000強制轉換成函式指標,即:

(void (*)())0×100000

然後再呼叫它:

*((void (*)())0×100000)();

用typedef可以看得更直觀些:

typedef void(*)() voidfuncptr;

*((voidfuncptr)0×100000)();

4、下面的函式實現在乙個數上加乙個數,有什麼錯誤?請改正。

int add_n ( int n )

當你第二次呼叫時得不到正確的結果,難道你寫個函式就是為了呼叫一次?問題就出在 static上

5、下面這個程式執行後會有什麼錯誤或者效果:

#define max 255

int main()

解答:死迴圈加陣列越界訪問(c/c++不進行陣列越界檢查)

max=255

陣列a的下標範圍為:0..max-1,這是其一其二、

當i迴圈到255時,迴圈內執行:

a[255]=255;

這句本身沒有問題

,但是返回for (i=0;i<=max;i++)語句時,

由於unsigned char的取值範圍在(0..255),i++以後i又為0了..無限迴圈下去.

6、請問一下程式將輸出什麼結果?

char *retmenory(void)

void test(void)

retmenory執行完畢,p資源被**,指向未知位址。返回位址,str的內容應是不可**的, 列印的應該是str的位址

7、對下面程式進行分析

void test2()

strcpy( string, str1 );

}解答:

字元陣列str1不能在陣列內結束

strcpy(string, str1)呼叫使得從str1記憶體起複製到string記憶體起所複製的位元組數具有不確定性

指出庫函式strcpy工作方式

str1不能在陣列內結束:因為str1的儲存為:,沒有'\0'(字串結束符),所以不能結束

strcpy( char *s1,char *s2)他的工作原理是,掃瞄s2指向的記憶體,逐個字元付到s1所指向的記憶體,直到碰到'\0',因為str1結尾沒有'\0',所以具有不確定性,不知道他後面還會付什麼東東。

正確應如下

void test2()

str[i]='\0';//加上結束符

strcpy( string, str1 );}8、

分析下列**輸出的值

int arr = ;

int *ptr = arr;

*(ptr++)+=123;

printf(「 %d %d 」, *ptr, *(++ptr));

輸出:8 8

過程:對於*(ptr++)+=123;先做加法6+123,然後++,指標指向7;對於printf(「 %d %d 」, *ptr, *(++ptr));從後往前執行,指標先++,指向8,然後輸出8,緊接著再輸出8

9、分析下面的**:

char *a = "hello";

char *b = "hello";

if(a= =b)

printf("yes");

else

printf("no");

輸出yes

"hello"是乙個常量字串

,位於靜態儲存區,在程式生命期內恆定不變

,a和b同時指向同乙個hello的。

10、已知strcpy函式的原型是:

char * strcpy(char * strdest,const char * strsrc);

不呼叫庫函式,實現strcpy函式。

解釋為什麼要返回char *。解答:

strcpy實現**

:char * strcpy( char *strdest, const char *strsrc )

11、判斷乙個字串是不是回文

int isreversestr(char *astr)

return found;

}12、

寫乙個函式比較兩個字串str1和str2的大小,若相等返回0,若str1大於

str2返回1,若str1小於str2返回-1

int strcmp ( const char * src,const char * dst)

if ( ret < 0 )

ret = -1 ;

else if ( ret > 0 )

ret = 1 ;

return( ret );

}13、

給定字串a和b,輸出a和b中的最大公共子串。

比如a="aocdfe" b="pmcdfa" 則輸出"cdf"

*///author: azhen

#include

#include

#include

char *commanstring(char shortstring, char longstring)

}return null;

}int

main()

14、編寫乙個 c 函式,該函式在乙個字串中找到可能的最長的子字串,且該字串是由同一字元組成的。

char * search(char *cpsource, char ch)

++cpsource;

}return cpdest;

} 15、

不用庫函式,用c語言實現將一整型數字轉化為字串

int getlen(char *s)

void reverse(char s)

}void itoa(int n,char s)

while((n /= 10) > 0);/*delete the number*/

if(sign < 0)

s[i++] = '-';

s[i] = '\0';

reverse(s);

}16、

請說出const與#define 相比,有何優點?答:c

onst作用:定義常量、修飾函式引數、修飾函式返回值三個作用。被const修飾的東西都受到強制保護,可以預防意外的變動,能提高程式的健壯性。

a、const常量有資料型別,而巨集常量沒有資料型別。編譯器可以對前者進行型別安全檢查。而對後者只進行字元替換,沒有型別安全檢查,並且在字元替換可能會產生意料不到的錯誤。

b、有些整合化的除錯工具可以對const 常量進行除錯,但是不能對巨集常量進行除錯。

17、編寫用c語言實現的求n階階乘問題的遞迴演算法:

答:long int fact(int n)

18、二分查詢演算法:

a遞迴方法實現:

int bsearch(elemtype a,elemtype x,int low,int high)

/*在下

界為low,上界為high的陣列a中折半查詢資料元素x*/

b、非遞迴方法實現:

int bsearch(elemtype a,keytype key,int n)

return -1;

}19、

遞迴計算如下遞迴函式的值(斐波拉契)

f(1)=1

f(2)=1

f(n)=f(n-1)+f(n-2) n>2

解:a、

非遞迴演算法

int f(int n)

return(s);}b、

遞迴演算法

int f(int n)

20、如何判斷一段程式是由c 編譯程式還是由c++編譯程式編譯的?

答:#ifdef __cplusplus

cout<<"c++";

#else

cout<<"c";

#endif

21、結構與

共用體有和區別?

答:a、

結構和共用體

都是由多個不同的資料型別成員組成, 但在任何同一時刻,

共用體中只存放了乙個被選中的成員(所有成員共用一塊位址空間), 而結構的所有成員都存在(不同成員的存放位址不同)。

b、對於

共用體的不同成員賦值, 將會對其它成員重寫, 原來成員的值就不存在了, 而對於結構的不同成員賦值是互不影響的

面試題解析,3道經典嵌入式Linux面試題

題一 簡述memcpy和strcpy的區別?題二 訊號量與互斥鎖的區別?題三 簡述程式編譯的過程?題一答案 1 複製的內容不同。strcpy只能複製字串,而memcpy可以複製任意內容,例如字元陣列 整型 結構體 類等。2 複製的方法不同。strcpy不需要指定長度,它遇到被複製字元的串結束符 0 ...

嵌入式面試題 ARM面試題(二)

填空題 1 arm微處理器在較新的體系結構中支援兩種指令集 答案 arm指令集 thumb指令集 2 arm處理器有9種基本定址方式,分別是 答案 暫存器定址 立即定址 暫存器偏移定址 暫存器間接定址 基址定址 多暫存器定址 堆疊定址 塊拷貝定址 相對定址 3 arm指令集可以分為6類,分別是 答案...

嵌入式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...