C語言經典問題學習筆記之二
【參考答案】
(1)引用被建立的同時必須被初始化(指標則可以在任何時候被初始化) 。
(2)不能有 NULL 引用,引用必須與合法的儲存單元關聯(指標則可以是NULL) 。
(3)一旦引用被初始化,就不能改變引用的關係(指標則可以隨時改變所指的物件) 。
2.
void getmemory(char *p){
p=(char *) malloc(100);
strcpy(p,“hello world”);
}
int main( )
{
char *str=NULL;
getmemory(str);
printf(“%s/n”,str);
free(
return 0;
}會出現什麼問題?
【標準答案】程式崩潰,getmemory中的malloc不能返回動態記憶體,即形參p是接收的str的地址,而在malloc的過程中,p的值發生了變化,而str的內容還是原來的NULL/
3.
charszstr[10];strcpy(szstr,"0123456789");
產生什麼結果?為什麼? 【標準答案】長度不一樣,出現段錯誤。 4. 陣列和連結串列的區別?
【標準答案】
陣列:資料順序儲存,固定大小;連結串列:資料可以隨機儲存,大小可動態改變
5.
void main(){
char aa[10];
printf
} 會出現什麼問題?列印結果是是多少?
【標準答案】sizeof()和初不初始化,沒有關係,strlen()和初始化有關,列印結果值未知。
6.
給定結構struct A{
char t:4;
char k:4;
unsigned short i:8;
unsigned long m;
};
問
【標準答案】8
7.
struct name1{char str;
short x;
int num;
};
求sizeof(name1)?
【標準答案】8
8.
struct name2{char str;
int num;
short x;
};求sizeof(name2)?
【標準答案】12
9.
程式哪裡有錯誤wap( int*p1,int* p2 )
{
int *p;
*p = *p1;
*p1 = *p2;
*p2 = *p;
}
【標準答案】p為野指標
10.
(void*)ptr和(*(void**))ptr的結果是否相同?其中ptr為同一個指標。【標準答案】(void*)ptr和(*(void**))ptr值是相同的
11.
要求設定一絕對地址為0x67a9的整型變數的值為0xaa66? 【標準答案】int *ptr;
ptr = (int*)0x67a9;
*ptr = 0xaa55;
12.
要對絕對地址0x100000賦值,我們可以用(unsigned int*)0x100000= 1234;那麼要是想讓程式跳轉到絕對地址是0x100000去執行,應該怎麼做? 【標準答案】 *((void (*)( ))0x100000 ) ();
首先要將0x100000強制轉換成函式指標,即:
(void (*)())0x100000
然後再呼叫它:
*((void (*)())0x100000)();
13.
inta,b,c請寫函式實現c=a+b ,不可以改變資料型別,如將c改為long int,關鍵是如何處理溢位問題 【標準答案】 bool
add (inta,
intb,int *c)
{
*c=a+b;
return (a>0 && b>0&&(*c<a || *c<b) || (a<0 && b<0&&(*c>a|| *c>b)));
}
14.
標頭檔案中的ifndef/define/endif幹什麼用?【標準答案】防止該標頭檔案被重複引用。
15.
關鍵字volatile有什麼含意?並給出三個不同的例子。 【參考答案】 一個定義為volatile的變數是說這變數可能會被意想不到地改變,這樣,編譯器就不會去假設這個變數的值了。精確地說就是,優化器在用到這個變數時必須每次都小心地重新讀取這個變數的值,而不是使用儲存在暫存器裡的備份。下面是volatile變數的幾個例子:1). 並行裝置的硬體暫存器(如:狀態暫存器)2). 一箇中斷服務子程式中會訪問到的非自動變數(Non-automaticvariables)3). 多執行緒應用中被幾個任務共享的變數
16.
#include <filename.h> 和 #include “filename.h” 有什麼區別?【標準答案】對於#include <filename.h> ,編譯器從標準庫路徑開始搜尋filename.h ; 對於#include “filename.h” ,編譯器從使用者的工作路徑開始搜尋 filename.h。
17.
const有什麼用途?(請至少說明兩種)【標準答案】
(1)可以定義const常量
(2)const可以修飾函式的引數、返回值,甚至函式的定義體。被 const修飾的東西都受到強制保護,可以預防意外的變動,能提高程式的健壯性。
18.
下面的宣告都是什麼意思?constint a;
intconst a;
constint *a;
int *
const a;
intconst * a
const;
兩個的作用是一樣,a是一個常整型數。第三個意味著a是一個指向常整型數的指標(也就是,整型數是不可修改的,但指標可以)。 第四個意思a是一個指向整型數的常指標(也就是說,指標指向的整型數是可以修改的,但指標是不可修改的)。最後一個意味著a是一個指向常整型數的常指標(也就是說,指標指向的整型數是不可修改的,同時指標也是不可修改的
19.
Heap與stack的差別。標準答案】Heap是堆,stack是棧。Stack的空間由作業系統自動分配/釋放
Heap上的空間手動分配/釋放。Stack空間有限,Heap是很大的自由儲存區
C中的malloc函式分配的記憶體空間即在堆上,C++中對應的是new操作符。程式在編譯期對變數和函式分配記憶體都在棧上進行,且程式執行過程中函式呼叫時引數的傳遞也在棧上進行。20.
程式的區域性變數存在於___中,全域性變數存在於____中,動態申請資料存在於___中。【標準答案】程式的區域性變數存在於棧(stack)中,全域性變數存在於靜態資料區 中,動態申請資料存在於堆(heap)中。
21.
堆疊溢位一般是由什麼原因導致的? 【標準答案】沒有回收垃圾資源。22.
佇列和棧有什麼區別?【標準答案】佇列先進先出,棧後進先出。
23.
用預處理指令#define 宣告一個常數,用以表明1年中有多少秒(忽略閏年問題) 【參考答案】#defineSECONDS_PER_YEAR (60 * 60 * 24 * 365)UL24.
用巨集定義寫出swap(x,y),即交換兩數。 【標準答案】 #define swap(x, y)(x)=(x)+(y);(y)=(x)–(y);(x)=(x)–(y);25.
寫一個“標準”巨集,這個巨集輸入兩個引數並返回較小的一個。【標準答案】#defineMin(X, Y) ((X)>(Y)?(Y):(X))//結尾沒有;
26.
以下是求一個數的平方的程式,請找出錯誤:#defineSQUARE(a)((a)*(a))
int a=5;
int b;
b=SQUARE(a++);
【標準答案】巨集在預編譯時會以替換的形式展開,僅僅會替換。涉及到巨集的地方,不要用++ --,標準中對此沒有規定,因此最終結果將會依賴於不同的編譯器。執行程式的答案可能是25、也有可能是36。
27.
給定一個整型變數a,寫兩段程式碼,第一個設定a的bit 3,第二個清除a 的bit 3。在以上兩個操作中,要保持其它位不變。【標準答案】
#define BIT3 (0x1 <<3)
static inta;
void set_bit3(void) voidclear_bit3(void)
{ {
} }
28.
關鍵字volatile有什麼含意? 【標準答案】提示編譯器物件的值可能在編譯器未監測到的情況下改變。