C語言面試

2021-07-05 18:15:39 字數 3991 閱讀 1303

2

、評價下面的**片斷:

unsigned int zero = 0;

unsigned int compzero = 0xffff;

對於乙個

int型不是

16位的處理器為說,上面的**是不正確的。應編寫如下:

unsigned int compzero = ~0;

這一問題真正能揭露出應試者是否懂得處理器字長的重要性。在我的經驗裡,好的嵌入式程式設計師非常準確地明白硬體的細節和它的侷限,然而

pc機程式往往把硬體作為乙個無法避免的煩惱。

int main()

8

、請問下面程式有什麼錯誤

?

int a[60][250][1000],i,j,k;

for(k=0;k<=1000;k++)

for(j=0;j<250;j++)

for(i=0;i<60;i++)

a[i][j][k]=0;

答案:把迴圈語句內外換一下

11

、寫出下面的結果

char str1 = "abc";

char str2 = "abc";

const char str3 = "abc";

const char str4 = "abc";

const char *str5 = "abc";

const char *str6 = "abc";

char *str7 = "abc";

char *str8 = "abc";

cout << ( str1 == str2 ) << endl;

cout << ( str3 == str4 ) << endl;

cout << ( str5 == str6 ) << endl;

cout << ( str7 == str8 ) << endl;

結果是:

0 0 1 1

解答:str1,str2,str3,str4

是陣列變數,它們有各自的記憶體空間; 而

str5,str6,str7,str8

是指標,它們指向相同的常量區域。

12

、以下**中的兩個

sizeof

用法有問題嗎?

void uppercase( char str ) //

將str

中的小寫字母轉換成大寫字母

char str = "abcde";

cout << "str

字元長度為

: " << sizeof(str)/sizeof(str[0]) << endl;

uppercase( str );

cout << str << endl;

答:函式內的

sizeof

有問題。根據語法,

sizeof

如用於陣列,只能測出靜態陣列的大小,無法檢測動態分配的或外部陣列大小。函式外的

str是乙個靜態定義的陣列,因此其大小為

6,函式內的

str實際只是乙個指向字串的指標,沒有任何額外的與陣列相關的資訊,因此

sizeof

作用於上只將其當指標看,乙個指標為

4個位元組,因此返回4。

main() ;

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

printf("%d,%d",*(a+1),*(ptr-1)); }

輸出:2,5

*(a+1

)就是a[1]

,*(ptr-1)

就是a[4],

執行結果是2,

5 &a+1

不是首位址

+1,系統會認為加乙個

a陣列的偏移,是偏移了乙個陣列的大小(本例是5個

int)

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

ptr實際是

&(a[5]),

也就是a+5

原因如下: &a

是陣列指標,其型別為

int (*)[5];

而指標加

1要根據指標型別加上一定的值,

不同型別的指標

+1之後增加的大小不同 a

是長度為5的

int陣列指標,所以要加

5*sizeof(int) 所以

ptr實際是

a[5] 但是

prt與

(&a+1)

型別是不一樣的

(這點很重要)

所以prt-1

只會減去

sizeof(int*)

a,&a

的位址是一樣的,但意思不一樣,

a是陣列首位址,也就是

a[0]

的位址,

&a是物件(陣列)首位址,

a+1a[1],&a+1

a[5].

函式前加

static

修飾表明

該函式只能在

所在的原始檔裡呼叫

21

、對絕對位址

0x100000

賦值且想讓程式跳轉到絕對位址是

0x100000

去執行

(unsigned int*)0x100000 = 1234;

首先要將

0x100000

強制轉換成函式指標,即

: (void (*)())0x100000

然後再呼叫它:

*((void (*)())0x100000)(); 用

typedef

可以看得更直觀些:

typedef void(*)() voidfuncptr;

*((voidfuncptr)0x100000)();

指向函式的指標??

void getmemory(char **p,int num)

int main()

printf("\n str is %s",str);

getchar(); }

問輸出結果是什麼?希望大家能說說原因,先謝謝了 輸出

str is world。

free

只是釋放

str指向的記憶體空間

,它本身的值還是存在的

.

所以free

之後,有乙個好的習慣就是將

str=null. 此時

str指向空間的記憶體已被**

,如果輸出語句之前還存在分配空間的操作的話

,這段儲存空間是可能被重新分配給其他變數的,

儘管這段程式確實是存在大大的問題(上面各位已經說得很清楚了),但是通常會列印出

world來。

這是因為,程序中的記憶體管理一般不是由作業系統完成的,而是由庫函式自己完成的。 當你

malloc

一塊記憶體的時候,管理庫向作業系統申請一塊空間(可能會比你申請的大一些),然後在這塊空間中記錄一些管理資訊(一般是在你申請的記憶體前面一點),並將可用記憶體的位址返回。但是釋放記憶體的時候,管理庫通常都不會將記憶體還給作業系統,因此你是可以繼續訪問這塊位址的,只不過。。。。。。。。樓上都說過了,最好別這麼幹。

sizeof(int)is 4

sizeof(long)is4

sizeof(char)is 4

sizeof(short)is 2

sizeof(double)is 8

sizeof(float)is 4

sizeof (long int )is 4

C語言面試

首先先看這篇部落格,不是我自己的但是能有不少幫助,這裡部分算抄襲這位大牛的部落格 正確答案 define min a,b a b a b 錯誤答案 define min a,b a b a b 或者 define min a,b a b a b 迴圈演算法 link node reverse lin...

面試基礎語言c

1.c 與c的區別 2.如何讓乙個c 程式執行c的程式且不需要對函式進行名字重整extern c 3.指標與引用的區別 4.c 中間的指標傳遞和引用傳遞 5.形參與實參 6.三種傳遞 7.static 8.靜態變數的初始化 9.const 10.指標與const 11.mutable 12.exte...

C語言面試題

基礎篇 1 區域性變數能否和全域性變數重名?可以2 如何引用乙個已經定義過的全域性變數?直接呼叫並初始化 3 全域性變數可不可以定義在可被多個.c檔案包含的標頭檔案中?為什麼?可以,6 堆和棧有什麼區別?7 什麼是預編譯,何時需要預編譯 8 c和c 中的struct有什麼不同?9 memset me...