C語言面試題

1.static關(guān)鍵字的作用?

1)第一個(gè)作用:隱藏。當(dāng)我們同時(shí)編譯多個(gè)文件時(shí),所有未加static前綴的全局變量和函數(shù)都具有全局可見性。

2)static的第二個(gè)作用是保持變量內(nèi)容的持久。存儲(chǔ)在靜態(tài)數(shù)據(jù)區(qū)的變量會(huì)在程序剛開始運(yùn)行時(shí)就完成初始化,也是唯一的一次初始化。共有兩種變量存儲(chǔ)在靜態(tài)存儲(chǔ)區(qū):全局變量和static變量,只不過和全局變量比起來,static可以控制變量的可見范圍,說到底static還是用來隱藏的。

3)static的第三個(gè)作用是默認(rèn)初始化為0。其實(shí)全局變量也具備這一屬性,因?yàn)槿肿兞恳泊鎯?chǔ)在靜態(tài)數(shù)據(jù)區(qū)。在靜態(tài)數(shù)據(jù)區(qū),內(nèi)存中所有的字節(jié)默認(rèn)值都是0x00,某些時(shí)候這一特點(diǎn)可以減少程序員的工作量。

2.線程與進(jìn)程的區(qū)別和聯(lián)系?

一個(gè)進(jìn)程可以有一個(gè)或者多個(gè)線程組成,

進(jìn)程和程序并不是一一對(duì)應(yīng)的,一個(gè)程序執(zhí)行在不同的數(shù)據(jù)集上就成為不同的進(jìn)程,可以用進(jìn)程控制塊來唯一地標(biāo)識(shí)每個(gè)進(jìn)程。而這一點(diǎn)正是程序無法做到的,由于程序沒有和數(shù)據(jù)產(chǎn)生直接的聯(lián)系,既使是執(zhí)行不同的數(shù)據(jù)的程序,他們的指令的集合依然是一樣的,所以無法唯一地標(biāo)識(shí)出這些運(yùn)行于不同數(shù)據(jù)集上的程序。一般來說,一個(gè)進(jìn)程肯定有一個(gè)與之對(duì)應(yīng)的程序,而且只有一個(gè)。而一個(gè)程序有可能沒有與之對(duì)應(yīng)的進(jìn)程(因?yàn)樗鼪]有執(zhí)行),也有可能有多個(gè)進(jìn)程與之對(duì)應(yīng)(運(yùn)行在幾個(gè)不同的數(shù)據(jù)集上)。

3.堆和棧的區(qū)別?

1)、棧區(qū)(stack)―由編譯器自動(dòng)分配釋放,存放函數(shù)的參數(shù)值,局部變量的值等。其操作方式類似于數(shù)據(jù)結(jié)構(gòu)中的棧。

2)、堆區(qū)(heap)―一般由程序員分配釋放,若程序員不釋放,程序結(jié)束時(shí)可能由OS回收。

4.C語言如何判斷兩個(gè)單向無環(huán)鏈表是否相交?

只需判斷兩個(gè)鏈表的尾節(jié)點(diǎn)地址是否相同,相同則相交,不同則不相交

5.程序在內(nèi)存中運(yùn)行時(shí),內(nèi)存分幾個(gè)區(qū),各自用途?

1)棧--有編譯器自動(dòng)分配釋放2.--一般由程序員分配釋放,若程序員不釋放,程序結(jié)束時(shí)可能由OS回收3.全局區(qū)(靜態(tài)區(qū))--全局變量和靜態(tài)變量的存儲(chǔ)是放在一塊

的,初始化的全局變量和靜態(tài)變量在一塊區(qū)域,未初始化的全局變量和未初始化的靜態(tài)變量在相鄰的另一塊區(qū)域。程序結(jié)束釋放。4.另外還有一個(gè)專門放常量的地方。程序結(jié)束釋放。

6.引用與指針有什么區(qū)別

指針指向一塊內(nèi)存,它的內(nèi)容是所指內(nèi)存的地址;引用是某塊內(nèi)存的別名

1.指針是一個(gè)實(shí)體,而引用僅是個(gè)別名;

2.引用使用時(shí)無需解引用(*),指針需要解引用;

3.引用只能在定義時(shí)被初始化一次,之后不可變;指針可變;

4.引用沒有const,指針有const;

5.引用不能為空,指針可以為空;

6.“sizeof引用”得到的是所指向的變量(對(duì)象)的大小,而“sizeof指針”得到的是指針本身(所指向的變量或?qū)ο蟮牡刂?的大??;

7.指針和引用的自增(++)運(yùn)算意義不一樣;

8.從內(nèi)存分配上看:程序?yàn)橹羔樧兞糠峙鋬?nèi)存區(qū)域,而引用不需要分配內(nèi)存區(qū)域。

7.

編程:

1.請(qǐng)問運(yùn)行完Test函數(shù)后,會(huì)有什么樣的結(jié)果。

(1)

void GetMemory(char *p)

{

p = (char *)malloc(100);

}

void Test(void)

{

char *str = NULL;

GetMemory(str);

strcpy(str, "hello world");

printf(str);

}

請(qǐng)問運(yùn)行Test函數(shù)會(huì)有什么樣的結(jié)果?

答:程序崩潰。

因?yàn)?b>GetMemory并不能傳遞動(dòng)態(tài)內(nèi)存,

Test函數(shù)中的str一直都是NULL。

strcpy(str, "hello world");將使程序崩潰。

(2)

char *GetMemory(void)

{

char p[] = "hello world";

return p;

}

void Test(void)

{

char *str = NULL;

str = GetMemory();

printf(str);

}

請(qǐng)問運(yùn)行Test函數(shù)會(huì)有什么樣的結(jié)果?

(2)答:可能是亂碼。

因?yàn)镚etMemory返回的是指向“棧內(nèi)存”的指針,該指針的地址不是NULL,但其原現(xiàn)的內(nèi)容已經(jīng)被清除,新內(nèi)容不可知。

(3)

void GetMemory2(char **p, int num)

{

*p = (char *)malloc(num);

}

void Test(void)

{

char *str = NULL;

GetMemory(&str, 100);

strcpy(str, "hello");

printf(str);

}

請(qǐng)問運(yùn)行Test函數(shù)會(huì)有什么樣的結(jié)果?

答:

1)能夠輸出hello

2)內(nèi)存泄漏

(4)

void Test(void)

{

char *str = (char *) malloc(100);

strcpy(str,“hello”);

free(str);

if(str !=NULL)

{

strcpy(str,“world”);

printf(str);

}

}

請(qǐng)問運(yùn)行Test函數(shù)會(huì)有什么樣的結(jié)果?

答:篡改動(dòng)態(tài)內(nèi)存區(qū)的內(nèi)容,后果難以預(yù)料,非常危險(xiǎn)。

因?yàn)閒ree(str);之后,str成為野指針,

if(str != NULL)語句不起作用。

2.編寫strcpy函數(shù)(10分)

已知strcpy函數(shù)的原型是

char*strcpy(char *strDest, const char *strSrc);

其中strDest是目的字符串,strSrc是源字符串。

(1)不調(diào)用C++/C的字符串庫函數(shù),請(qǐng)編寫函數(shù)strcpy

char *strcpy(char*strDest, const char *strSrc);

{

assert((strDest!=NULL) && (strSrc!=NULL));

char *address =strDest;

while( (*strDest++ = *strSrc++) !=\0)

NULL ;

returnaddress ;

}

(2)strcpy能把strSrc的內(nèi)容復(fù)制到strDest,為什么還要char *類型的返回值?

答:為了實(shí)現(xiàn)鏈?zhǔn)奖磉_(dá)式。

例如intlength = strlen( strcpy( strDest,“hello world”));

3.#include

intmain()

{

inta =0x0101;

intb =0x0202;

intc;

c = a&(~b);

c = c|b;

printf("%x,%d\n",c,c);

return0;

}

答案:303,771

4.完成下面函數(shù)以實(shí)現(xiàn)使用輾轉(zhuǎn)相除法獲取兩個(gè)數(shù)(假設(shè)兩個(gè)數(shù)都大于0)的最大公約數(shù)

example:gcd(20,5 ) = 5.gcd(3,10 ) = 1.gcd(1620,1280 ) = 20.

unsigned int gcd(unsignedint

a,unsigned

int b)

{

intc=0;

if(m%n==0) c =n;

else

c=gcd(n,m%n);

returnc;

}

5.用嵌套方式寫一個(gè)函數(shù),函數(shù)返回N的階層,要求盡量寫完整

int fun(int n)

{

if (n ==1)

returnn;

returnn*(n-1);

}

6.請(qǐng)寫出下列數(shù)據(jù)類型的范圍char,unsigned char,short,int

答:char(-127~128)unsigned char(0~255)short(-2^16-1 ~2^16)int(-32768~32767)

7.請(qǐng)寫出下面函數(shù)的返回值

char fuc1(){

unsigned int a = 6;

int b = -12;

return(a+b>6)?1:0

}

#define SQP(x)(x*x)

int fuc2()

{

int a = 3;

return SQR(a+2);

}

答:111

8.請(qǐng)計(jì)算下列結(jié)構(gòu)所占字節(jié)數(shù)

Typedef structYouKnoow

{

int id;

short age;

char level;

}

答:8

9.關(guān)鍵字const有什么含義?

const修飾誰,誰在整個(gè)程序運(yùn)行過程中不能變

10.下方代碼輸出結(jié)果為

main()

{

int a[5] = {1, 2,3, 4, 5};

int *ptr = (int*)(&a+1);

printf(“%d%d”, *(a+1), *(ptr-1));

}

答:D:4, 5

11.用c/c++實(shí)現(xiàn)冒泡排序

voidswap_sort(int *p, int n) {

intI, j;

inttmp;

for(i=0;i

for(j=0;j

if(p[j]>p[j+1]){

tmp=p[j];

p[j]=p[j+1];

p[j+1]=tmp;

}

}

}

}

12.用嵌套的方式寫一個(gè)函數(shù),該函數(shù)返回N的階乘(N!=1*2*..*N)

int func(int n){if (n==1) return 1; return n * x(n-1);}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • iOS面試小貼士 ———————————————回答好下面的足夠了------------------------...
    不言不愛閱讀 2,253評(píng)論 0 7
  • ———————————————回答好下面的足夠了---------------------------------...
    恒愛DE問候閱讀 1,843評(píng)論 0 4
  • 多線程、特別是NSOperation 和 GCD 的內(nèi)部原理。運(yùn)行時(shí)機(jī)制的原理和運(yùn)用場(chǎng)景。SDWebImage的原...
    LZM輪回閱讀 2,124評(píng)論 0 12
  • 史上最全的iOS面試題及答案 迷途的羔羊--專為路癡量身打造的品牌。史上最精準(zhǔn)的定位。想迷路都難!閃電更新中......
    南虞閱讀 1,636評(píng)論 0 8
  • 史上最全的iOS面試題及答案 iOS面試小貼士———————————————回答好下面的足夠了----------...
    Style_偉閱讀 2,575評(píng)論 0 35

友情鏈接更多精彩內(nèi)容