嵌入式软件工程师笔试题
1?.?用預處理指令?#define?聲明一個常數(shù),用以表明?1年中有多少秒(忽略閏年問題)?
#define?SECONDS_PER_YEAR?(60?*?60?*?24?*?365)UL
2?.?寫一個?"標準"宏?MIN?,這個宏輸入兩個參數(shù)并返回較小的一個。?
#define?MIN(A,B)((A)?<=?(B)???(A)?:?(B))?
已知一個數(shù)組table,用一個宏定義,求出數(shù)據(jù)的元素個數(shù)。
參考答案:#define NTBL
#define NTBL (sizeof(table)/sizeof(table[0]))
3.?預處理器標識?#error的目的是什么?
不知道
4.?嵌入式系統(tǒng)中經(jīng)常要用到無限循環(huán),你怎么樣用?C編寫死循環(huán)呢??這個問題用幾個解決方案。我首選的方案是:?
while(1)?{??}?
一些程序員更喜歡如下方案:?for(;;)?{??}
5.?用變量?a給出下面的定義?
a)?一個整型數(shù)(?An?integer)?
b)一個指向整型數(shù)的指針(?A?pointer?to?an?integer)?
c)一個指向指針的的指針,它指向的指針是指向一個整型數(shù)(?A?pointer?to?a?pointer?to?an?intege)r?
d)一個有?10個整型數(shù)的數(shù)組(?An?array?of?10?integers)?
e)一個有?10個指針的數(shù)組,該指針是指向一個整型數(shù)的。(?An?array?of?10?pointers?to?integers)?
f)?一個指向有?10個整型數(shù)數(shù)組的指針(?A?pointer?to?an?array?of?10?integers)?
g)?一個指向函數(shù)的指針,該函數(shù)有一個整型參數(shù)并返回一個整型數(shù)(?A?pointer?to?a?function?that?takes?an?integer?as?an?argument?and?returns?an?integer)?
h)一個有?10個指針的數(shù)組,該指針指向一個函數(shù),該函數(shù)有一個整型參數(shù)并返回一個整型數(shù)(?An?array?of?ten?pointers?to?functions?t?hat?take?an?integer?argument?and?return?an?integer?)?答案是:?
a)?int?a;?//?An?integer?
b)?int?*a;?//?A?pointer?to?an?integer?
c)?int?**a;?//?A?pointer?to?a?pointer?to?an?integer?d)?int?a[10];?//?An?array?of?10?integers?
e)?int?*a[10];?//?An?array?of?10?pointers?to?integers?
f)?int?(*a)[10];?//?A?pointer?to?an?array?of?10?integers?
g)?int?(*a)(int);?//?A?pointer?to?a?function?a?that?takes?an?integer?argument?and?returns?an?integer?
h)?int?(*a[10])(int);?//?An?array?of?10?pointers?to?functions?that?take?an?integer?argument?and?return?an?integer?
6.?關鍵字?static的作用是什么??
這個簡單的問題很少有人能回答完全。
在?C語言中,關鍵字?static有三個明顯的作用:
在函數(shù)體,一個被聲明為靜態(tài)的變量在這一函數(shù)被調用過程中維持其值不變。
在模塊內(但在函數(shù)體外),一個被聲明為靜態(tài)的變量可以被模塊內所用函數(shù)訪問,但不能被模塊外其它函數(shù)訪問。它是一個本地的全局變?量。?
在模塊內,一個被聲明為靜態(tài)的函數(shù)只可被這一模塊內的其它函數(shù)調用。那就是,這個函數(shù)被限制在聲明它的模塊的本地范圍內使用。
7.關鍵字?const有什么含意?
只讀
(1)欲阻止一個變量被改變,可以使用const關鍵字。在定義該const變量時,通常需要對它進行初始化,因為以后就沒有機會再去改變它了;
(2)對指針來說,可以指定指針本身為const,也可以指定指針所指的數(shù)據(jù)為const,或二者同時指定為const;
(3)在一個函數(shù)聲明中,const可以修飾形參,表明它是一個輸入?yún)?shù),在函數(shù)內部不能改變其值;
(4)對于類的成員函數(shù),若指定其為const類型,則表明其是一個常函數(shù),不能修改類的成員變量;
(5)對于類的成員函數(shù),有時候必須指定其返回值為const類型,以使得其返回值不為“左值”
const?int?a;?a是一個常整型數(shù)
int?const?a;?a是一個常整型數(shù)
const?int?*a;?a是一個指向常整型數(shù)的指針
int?*?const?a;?a是一個指向整型數(shù)的常指針
int?const?*?a?const;??a是一個指向常整型數(shù)的常指針
8.?關鍵字?volatile有什么含意??并給出三個不同的例子。
一個定義為?volatile的變量是說這變量可能會被意想不到地改變
并行設備的硬件寄存器(如:狀態(tài)寄存器)?
一個中斷服務子程序中會訪問到的非自動變量?(Non-automatic?variables)
多線程應用中被幾個任務共享的變量
9.?嵌入式系統(tǒng)總是要用戶對變量或寄存器進行位操作。給定一個整型變量?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;?
}
10.?嵌入式系統(tǒng)經(jīng)常具有要求程序員去訪問某特定的內存位置的特點。在某工程中,要求設置一絕對地址為?0x67a9的整型變量的值為?0xaa6
int?*ptr;?
ptr?=?(int?*)0x67a9;
*ptr?=?0xaa55;
11.?中斷是嵌入式系統(tǒng)中重要的組成部分,這導致了很多編譯開發(fā)商提供一種擴展?―讓標準?C支持中斷。具代表事實是,產生了一個新的關鍵?
字__interrupt。下面的代碼就使用了?__interrupt關鍵字去定義了一個中斷服務子程序?(ISR),請評論一下這段代碼的。?
__interrupt?double?compute_area?(double?radius)?{?
double?area?=?PI?*?radius?*?radius;?printf("\nArea?=?%f",?area);?return?area;?}?
這個函數(shù)有太多的錯誤了,以至讓人不知從何說起了:?
ISR不能返回一個值。如果你不懂這個,那么你不會被雇用的。?
ISR不能傳遞參數(shù)。如果你沒有看到這一點,你被雇用的機會等同第一項。?
在許多的處理器?/編譯器中,浮點一般都是不可重入的。有些處理器?/編譯器需要讓額處的寄存器入棧,有些處理器?/編譯器就是不允許在?IS?
R中做浮點運算。此外,?ISR應該是短而有效率的,在?ISR中做浮點運算是不明智的。
與第三點一脈相承,?printf()經(jīng)常有重入和性能上的問題。如果你丟掉了第三和第四點,我不會太為難你的。不用說,如果你能得到后兩點
12?.?下面的代碼輸出是什么,為什么??void?foo(void)?{?
unsigned?int?a?=?6;?int?b?=?-20;?
(a+b?>?6)???puts(">?6")?:?puts("<=?6");?}
?C語言中的整數(shù)自動轉換原則
當表達式中存在有符號類型和無符號類型時所有的操作數(shù)都自動轉換為無符號類型。
15?Typedef?在?C語言中頻繁用以聲明一個已經(jīng)存在的數(shù)據(jù)類型的同義字。也可以用預處理器做類似的事。
例如,思考一下下面的例子:?
#define?dPS?struct?s?*?
typedef?struct?s?*?tPS;
16?.?C語言同意一些令人震驚的結構?,下面的結構是合法的嗎,如果是它做些什么??
int?a?=?5,?b?=?7,?c;?
c?=?a+++b;?
就近原則
17 堆棧
int a = 0;全局初始化區(qū)
char *p1;全局未初始化區(qū)
main()
{
int b;棧
char s[] ="abc";棧
char *p2;棧
char *p3 ="123456"; 123456\0在常量區(qū),p3在棧上。
static int c =0;全局(靜態(tài))初始化區(qū)
p1 = (char*)malloc(10);
p2 = (char*)malloc(20);分配得來得10和20字節(jié)的區(qū)域就在堆區(qū)。
strcpy(p1,"123456"); 123456\0放在常量區(qū),編譯器可能會將它與p3所指向的"123456"優(yōu)化成一個地方。
18 什么是野指針?產生的原因?
“野指針”不是NULL指針,是指向“垃圾”內存(不可用內存)的指針。“野指針”是很危險的,if無法判斷一個指針是正常指針還是“野指針”。有個良好的編程習慣是避免“野指針”的唯一方法。
野指針的成因主要有三種:
一、指針變量沒有被初始化。指針變量在創(chuàng)建的同時應當被初始化,要么將指針設置為NULL,要么讓它指向合法的內存。
二、指針p被free或者delete之后,沒有置為NULL,讓人誤以為p是個合法的指針。
三、指針操作超越了變量的作用范圍。比如不要返回指向棧內存的指針或引用,因為棧內存在函數(shù)結束時會被釋放。比如說某個地址的生命期,使用一個沒有生命期的指針是非常危險的。
19 sizeof和strlen區(qū)別
sizeof
sizeof(...)是運算符,在頭文件中typedef為unsigned int,其值在編譯時即計算好了,參數(shù)可以是數(shù)組、指針、類型、對象、函數(shù)等。它的功能是:獲得保證能容納實現(xiàn)所建立的最大對象的字節(jié)大小。
strlen
strlen(...)是函數(shù),要在運行時才能計算。參數(shù)必須是字符型指針(char*)。當數(shù)組名作為參數(shù)傳入時,實際上數(shù)組就退化成指針了。
它的功能是:返回字符串的長度
某32位系統(tǒng)下, C++程序,請計算sizeof 的值(5分).
char str[] = “http://www.ibegroup.com/”
char *p = str ;
int n = 10;
請計算
sizeof (str ) = ?(1)
sizeof ( p ) = ?(2)
sizeof ( n ) = ?(3)
void Foo ( char str[100]){
請計算
sizeof( str ) = ?(4)
}
void *p = malloc( 100 );
請計算
sizeof ( p ) = ?(5)
答:(1)25 (2)4 (3) 4 (4)4 (5)4
20
char iArr[10]={0,1,2,3,4,5,6,7,8,9};
short int *pVal = NULL;
pVal = (short int *)(iArr+2);
short int tVal = *pVal;
請問:Intel CPU的計算機中:tVal = ?
char iArr[10]={0,1,2,3,4,5,6,7,8,9};
short int *pVal = NULL;
pVal = (short int *)(iArr+2); //pVal和(iArr+2)都指向數(shù)組iArr的的3個元素2的地址
short int tVal = *pVal; //pVal指向的地址的內容(按字節(jié))是:0x02,0x03,0x04,0x05
由于tVal和pVal分別是short類型的變量和指針
而Intel CPU的對short雙字節(jié)的存放是:高字節(jié)在后,低字節(jié)在前
所以,tVal=*pVal=0x02+(0x03<<8)=0x0302=77
21 寫出strcpy,strcmp,strlen,memcpy函數(shù)源碼的實現(xiàn)。
char * strcpy( char*strDest, const char *strSrc )
{
assert( (strDest !=NULL) && (strSrc != NULL) );
char *address =strDest;
while( (*strDest++= * strSrc++) !=‘\0’ );
return address;
}
int strlen( const char *str ) //輸入?yún)?shù)const
{
assert(strt != NULL); //斷言字符串地址非0
intlen;
while( (*str++) !='\0' )
{
len++;
}
return len;
}
內存區(qū)域相對位置和重疊關系 //不知道兩個指針的類型,不可以這樣自加
void* mymemcpy( void *dest, const void *src, size_t count )
{
char *ret;
char *dst_t;
char *src_t;
ret = (char *)dst;
if ((unsigned char*)dst <= (unsigned char*)src|| (unsigned char *)dst >= ((unsigned char *)src + count))
{ //Non-Overlapping Buffers,copy from lower addresses to higher addresse
dst_t = (char *)dst;
src_t = (char *)src;
while (count--)
{
*dst_t++ = *src_t++;
}
}else
{//Overlapping Buffers,copy from higher addresses to lower addresses
dst_t = (char *)dst + count - 1;
src_t = (char *)src + count - 1;
while (count--)
{
*dst_t-- = *src_t--;
}
}
return(ret);
}
int main( void )
{
char str[] = "0123456789";
mymemcpy( str+1, str+0, 9 );
cout << str << endl;
system( "Pause" );
return 0;
}
char * __cdecl strcat (char * dst, const char * src)
{
char * cp = dst;
while( *cp )
cp++; /* find end of dst */
while( *cp++ = *src++ ) ; /* Copy src to end of dst */
return( dst ); /* return dst */
}
int strcmp(char *str1,char *str2)
{
if(*str1==‘\0’||*str2==’\0’) return;
while(*str1!=’\0’&&*str2!=’\0’&&*str1==*str2)
{
str1++;
str2++;
}
if(*str1==*str2)
return 1;
else return 0;
}
}
22 請寫一個C函數(shù),判斷大小端。
int checkCPU()
{
{
union w
{
int a;
char b;
} c;
c.a = 1;
return (c.b == 1); 小端
}
}
23 與“零值”比較
分別給出BOOL,int,float,指針變量與“零值”比較的 if語句(假設變量名為var)
解答:
BOOL 型變量:if(!var)
int型變量:if(var==0)
float 型變量:
const floatEPSINON = 0.00001;
if ((x >= -EPSINON) && (x <= EPSINON)
指針變量:if(var==NULL)
24 對齊方式
·使用偽指令#pragma pack (n),編譯器將按照n 個字節(jié)對齊;
·使用偽指令#pragma pack (),取消自定義字節(jié)對齊方式。
25 不是使用變量,調換兩個變量的值
a = a + b;
b = a - b;
a = a - b;
或者:
a = a ^ b;
b = a ^ b;
a = a ^ b;
26
(1).Void GetMemory(char **p, int num){
*p = (char *)malloc(num);
}
void Test(void){
char *str = NULL;
GetMemory(&str, 100);
strcpy(str, "hello");
printf(str);
}
請問運行Test 函數(shù)會有什么樣的結果?
答:輸出“hello”
(2). void Test(void){
char *str = (char *) malloc(100);
strcpy(str, “hello”);
free(str);
if(str != NULL){
strcpy(str, “world”);
printf(str);
}
}
請問運行Test 函數(shù)會有什么樣的結果?
答:輸出“world”
(3). char *GetMemory(void){
char p[] = "hello world";
return p;
}
void Test(void){
char *str = NULL;
str = GetMemory();
printf(str);
}
請問運行Test 函數(shù)會有什么樣的結果?
答:無效的指針,輸出不確定
轉載于:https://www.cnblogs.com/gjianw217/p/5272489.html
總結
以上是生活随笔為你收集整理的嵌入式软件工程师笔试题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 安装jdk源码
- 下一篇: window覆盖导航栏