




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
2022年度C語言面試題庫匯編(含完整答案)
1、變量的聲明和定義有什么區(qū)別?
在C語言中聲明變量:變量聲明僅在編譯時向編譯器提供以給定類型和名稱存
在的變量的確定性,以便編譯器繼續(xù)進行進一步編譯,而不需要該變量的所有
細節(jié)。在C語言中,當我們聲明一個變量時,我們只將信息提供給編譯器,
但沒有為它保留內存。它只是一個引用,通過它我們只向編譯器保證這個變量
可以定義在函數(shù)內部或函數(shù)外部。注意:我們可以多次聲明一個變量,但只定
義一次。例如:externintdata;externintfoo(int,int);intfun(int,char);/
/
2、全局變量和靜態(tài)全局變量有什么區(qū)別?
全局變量和靜態(tài)全局變量有不同的聯(lián)系。這就是全局變量可以在文件外部訪問
但靜態(tài)全局變量只能在聲明它的文件內訪問的原因。靜態(tài)全局變量===?>
內部鏈接。非靜態(tài)全局變量===?>外部鏈接。
3、C語言中的存儲類是什么?
存儲類決定程序中變量或函數(shù)的范圍(生命周期)和范圍(可見性)。每個變量都
在內存中的某個位置以位的形式存儲變量的值。存儲類決定這些變量值將存儲
在CPU寄存器、堆棧內存、BSS或DS中的位置。C語言編程中有四種可
用的存儲類,它們如下:autostaticexternregister
4、內部靜態(tài)變量和外部靜態(tài)變量的區(qū)別是什么?
在C語言中,外部靜態(tài)變量有內部鏈接,內部靜態(tài)變量沒有鏈接。這就是它
們具有不同范圍但兩者都將在整個程序中存活的原因。外部靜態(tài)變量===?>
內部鏈接。內部靜態(tài)變量===?>無。
5、typedef和宏有什么區(qū)別?
讓我們先來看一下typedef和宏的簡短描述,以了解它們之間的區(qū)別。typed
efC語言提供了一個非常重要的關鍵字typedef,用于為現(xiàn)有類型定義新名稱。
typedef是編譯器指令,主要與用戶定義的數(shù)據(jù)類型(結構、聯(lián)合或枚舉)一起
使用,以降低它們的復變性并增加代碼的可讀性和可移植性。語法:typedef
typeNewTypeName;示例:typedefunsignedintUnsignedlnt;現(xiàn)在Unsi
gnedlnt是一個新類型,就可以施用它來創(chuàng)
6、以下C代碼的輸出是什么?
#include<stdio.h>
intmain()
typedefautointmyAutoInt;
myAutoIntdata=4;
printf("%d",data);
return0;
c
編譯器錯誤。解釋:typedef已被視為部分存儲類,因此不能一次混合兩個存
儲類。
7、C語言中的變量是什么?
C語言中的變量定義了一個位置名稱,可以在其中放置值,并且可以在程序中
需要時使用這些值。換句話說,可以說變量是一個名稱(或標識符),它指示內
存中的某個物理地址,其中數(shù)據(jù)以字符串位的形式存儲。在C語言中,每個
變量都有特定的數(shù)據(jù)類型(預定義的或用戶定義的),這些數(shù)據(jù)類型決定了變量
的大小和內存布局。注意:每個變量都綁定了兩個重要的屬性,范圍和范圍。
8、使用變量p寫出下一些聲明:
1、一個整數(shù)變量。
2、五個整數(shù)的數(shù)組。
3、指向整數(shù)的指針。
4、一個由十個指向整數(shù)的指針組成的數(shù)組。
5、指向整數(shù)的指針。
6、指向三個整數(shù)數(shù)組的指針。
7、一個指向函數(shù)的指針,它將指向字符的指針作為參數(shù)并返回一個整數(shù)。
8、一個由五個指針組成的數(shù)組,指向接受一個整數(shù)參數(shù)并返回一個整數(shù)的函數(shù)。
變量p對應的聲明如下:1.intp;//Aninteger2.intp[5];//Anarrayof
5integers3.int*p;//Apointertoaninteger4.int*p[10];//Anarray
of10pointerstointegers5.int**p;//Apointertoapointertoaninteg
er6.int(*p)[3];//Apointer
9、C語言有哪些數(shù)據(jù)類型?
數(shù)據(jù)類型是數(shù)據(jù)的分類,它告訴編譯器或解釋器程序員打算如何使用數(shù)據(jù)。換
句話說,您可以說它定義了變量的大?。˙YTE)和范圍。C語言中數(shù)據(jù)類型的分
類:1、預定義數(shù)據(jù)類型(int、char、float等)2、用戶定義的數(shù)據(jù)類型(struct、u
nion、enum)在C語言中,不同的數(shù)據(jù)類型有不同的范圍。范圍因編譯器而
異。在下表中,根據(jù)32位GCC編譯器列出了一些具有范圍和格式說明符
的數(shù)據(jù)類型。數(shù)據(jù)類型Memory(bytes)范圍
10、關鍵字static的用途是什么?
在C語言中,static關鍵字非常重要。如果在變量或函數(shù)中使用了static關
鍵字,那么只有內部鏈接或無鏈接有效。1、靜態(tài)變量只初始化一次,因此在函
數(shù)體內聲明為靜態(tài)的變量在函數(shù)調用之間保持其先前值。2、帶有static關鍵字
的全局變量具有內部鏈接,因此只能在翻譯單元(.c)內訪問。其他翻譯單元無
法訪問它。static關鍵字保護變量從另一個編譯單元訪問。3、默認情況下,
在C語言中,函數(shù)的鏈接是外部的,它可以被同一個或另一個翻譯單元訪
問。在static關鍵字的幫助下,可以
11、有哪些不同類型的鏈接?
C語言有3種鏈接,外部鏈接、內部鏈接和無鏈接。
12、靜態(tài)變量可以在頭文件中聲明嗎?
可以,我們可以在頭文件中聲明靜態(tài)變量。
13、C語言中整數(shù)的大小取決于什么?
C標準解釋了整數(shù)的最小大小應該是16位。一些編程語言解釋說整數(shù)的大小
取決于實現(xiàn),但可移植程序不應該依賴它。整數(shù)的大小主要取決于編譯器編寫
者為底層處理器編寫的編譯器類型??梢钥吹骄幾g器根據(jù)便利性和底層架構愉
快地改變整數(shù)的大小。因此,建議使用C99整數(shù)數(shù)據(jù)類型(uin8_t、uin16_
t、uin32_t..)代替標準into
14、整數(shù)是看符號的還是無符號的?
在標準C語言中,整數(shù)數(shù)據(jù)類型默認是有符號的。所以如果創(chuàng)建一個整數(shù)變
量,它可以存儲正值和負值。
15、C中的無符號整數(shù)和有符號整數(shù)有什么區(qū)別?
有符號和無符號整數(shù)類型具有相同的存儲(根據(jù)標準至少16位)和對齊方式,
但它們仍然存在很多差異,在下面的行中,描述有符號和無符號整數(shù)之間的一
些差異。有符號整數(shù)可以同時存儲正值和負值,但在它旁邊無符號整數(shù)只能存
儲正值。有符號整數(shù)類型的非負值范圍是相應無符號整數(shù)類型的子范圍。例
如:假設整數(shù)的大小為2個字節(jié)。有符號整數(shù)-32768到+32767無符號整
數(shù)0到65535在計算無符號整數(shù)時,它永遠不會溢出,因為如果計算結果大
于無符號整數(shù)類型的最大值,則它會以比結果類型可以表示的
16、宏和函數(shù)有什么區(qū)別?
宏和函數(shù)的區(qū)別如下所示:
17、以下C代碼的輸出是什么?
#include<stdio.h>
#definePRINT(var,data)do{\
if(van<data八
{\
printf("Aticleworld");\
++var;\
)\
}while(l);
intmain()
PRINT(0,2);
return0;
}
輸出:編譯器錯誤。說明:擴展宏時,var將被替換為O(Rvalue)。因為正
在嘗試增加Rvalue,所以將收到編譯器錯誤。
18、C語言中的枚舉是什么?
C語言中的枚舉是用戶定義的數(shù)據(jù)類型。它由一組命名的常量整數(shù)組成。使
用enum關鍵字,我們可以通過使用枚舉標簽(可選)和命名整數(shù)列表來聲明枚
舉類型?;旧?,我們使用枚舉來增加代碼的可讀性,并且與符號常量(宏)相
比,使用枚舉更容易調試代碼。enum最重要的屬性是它遵循范圍規(guī)則,編譯
器會自動將值分配給它的成員常量。注意:枚舉類型的變量存儲由該類型定義
的枚舉列表的值之一。enum的語法如下:enumEnumeration_Tag{Enu
meration_List};E
19、關鍵字const是什么?
const限定符僅向編譯器指示無法更改限定對象的值。簡單來說,const表
示不可修改(不能在運行時給對象賦值)。語法:constDataTypeIdentifier=
Value;e.g.constintiData=0;
20、什么時候應該在C程序中使用const?
在程序中有以下地方需要使用const關鍵字:在引用函數(shù)參數(shù)調用中,如果
不想更改已傳入函數(shù)的實際值。intPrintData(constchar*pcMessage);在
某些地方,const比宏更好,因為const由編譯器處理并且具有類型檢查。
constintciData=100;對于I/O和內存映射寄存器,const與volatile限
定符一起使用以實現(xiàn)高效訪問。constvolatileuint32_t*DEVICE_STATUS
21、以下代碼聲明的含義是什么?
1.constinta;
2.intconsta;
3.constint*a;
4.int*consta;
5.intconst*aconst;
a是一個常數(shù)整數(shù)。與第一個類似,a是一個常數(shù)整數(shù)。這里的a是一個指向
常量整數(shù)的指針,整數(shù)的值是不可修改的,但指針是可修改的。這里的a是一
個指向整數(shù)的常量指針,指向的整數(shù)的值是可修改的,但指針是不可修改的。
這里的a是一個指向const整數(shù)的const指針,這意味著指向的整數(shù)和指針
的值都是不可修改的。
22、下面的C程序的輸出是什么?
#include<stdio.h>
intmain()
intpos=14;
floatdata=1.2;
printf("%*f"jposjdata);
return0;
上述代碼的輸出將是1.200000,有6個空格。解釋:這里1.200000是用
6個空格打印的,因為通過在printf中給出*可以指定一個額外的寬度參
數(shù),這里pos是寬度,data是值。如果數(shù)字小于寬度,則其余部分用空格填
充。
23、常量指針和指向常量的指針有什么區(qū)別?
常量指針:常量指針是其值(指向的地址)不可修改的指針。如果嘗試修改指針
值,將得到編譯器錯誤。常量指針聲明如下:Data_Type*constPointer_N
ame;int*constptr;//constantpointertointeger當或譯以下代碼會得至U編
譯器錯誤時,讓我們看看下面的示例代碼。#include<stdio.h>intmain(void)
{intvar1=10,var2=20;//Initia
24、后遞增和遞減運算符是什么?
當在操作數(shù)上使用后自增(++)運算符時,結果是操作數(shù)的值,得到結果后,
操作數(shù)的值加1o后自減(-)的工作運算符類似于后自增運算符,但不同之
處在于操作數(shù)的值減1o注意:遞增和遞減1是指定的類型。
25、前置增量和后置增量哪個更好?
現(xiàn)在的編譯器已經(jīng)足夠聰明了,它們根據(jù)需求優(yōu)化代碼。post和pre-increm
ent都有自己的重要性,我們需要根據(jù)要求使用它們。如果您通過字符指針逐
字節(jié)讀取閃存,那么在這里您必須使用后增量,否則將跳過數(shù)據(jù)的第一個字
節(jié)。在預遞增的情況下,指向地址將先遞增,然后再讀取該值。在下面的示例
代碼中,創(chuàng)建一個字符數(shù)組并使用想要讀取數(shù)組值的字符指針。但是如果使用
預增量運算符會發(fā)生什么?這個問題的答案是“A”將被跳過而B將被打印出
來。#include<stdio.h>intm
26、表達式ptr++和++ptr相同嗎?
*ptr++和++*ptr兩種表達方式不同。下面通過一個示例代碼來了解這兩個表
達式之間的區(qū)別。#include<stdio.h>intmain(void){intaiData[5]={100,
200,30,40,50};int*ptr=aiData;*ptr++;printf("aiData[O]=%d,aiData[1]
=%d,*piData=%d",aiData[0],
27>表達式*++ptr和++*ptr是否相同?
這兩種表達方式不同。下面來看一個示例代碼來了解這兩個表達式之間的區(qū)
別示例1:#include<stdio.h>intmain(void){intaiData[5]={100,200,
30,40,50};int*piData=aiData;++*piData;printf("aiData[O]=%d,aiData
[1]=%d,*piData=%d",aiData[0],aiDat
28、常量和宏有什么區(qū)別?
常量和宏的主要區(qū)別如下:const關鍵字由編譯器處理,另一方面,宏由預處
理器指令處理。const是修飾標識符行為的限定符,但宏是預處理器指令。使
用const關鍵字會進行類型檢查,但不會對#define進行類型檢查。const由
C塊限定,#define適用于文件。const可以作為參數(shù)(作為指針)傳遞給函
數(shù)。在通過引用調用的情況下,它可以防止修改傳遞的對象值。
29、C語言中的volatile變量是什么?
volatile關鍵字是一種類型限定符,可防止編譯器優(yōu)化對象。根據(jù)C標準,
具有volatile限定類型的對象可能會以實現(xiàn)未知的方式進行修改或具有其他未
知的副作用。也可以說,可以隨時更改volatile限定對象的值,而無需代碼執(zhí)
行任何操作。如果對象由volatile限定符限定,則編譯器每次程序訪問它時都
會從內存中重新加載該值,這意味著它會阻止將變量緩存到寄存器中。從內存
中讀取值是檢查值的不可預測變化的唯一方法。
30、可以創(chuàng)建volatile指針嗎?
可以,可以在C語言中創(chuàng)建一個volatile指針。示例代碼如下:int*volatil
epiData;//piDataisavolatilepointertoaninteger.
31、如何正確使用volatile關鍵字的位置?
在這里,指出了一些需要使用volatile關鍵字的重要地方。1、訪問內存映射
的外設寄存器或硬件狀態(tài)寄存器。示例代碼:#defineCOM_STATUS_BIT0
X00000006uint32_tconstvolatile*constpStatusReg=(uint32_t*)0x0002
0000;unit32_tGetRecvData(){//Codetorecvdatawhile(((*pStatusReg)
&COM
32、C語言中的const和volatile限定符有什么區(qū)別?
const關鍵字是編譯器強制執(zhí)行的,它表示程序無法更改對象的值,這意味著
它使對象成為不可修改的類型。例如:constinta=0;如果嘗試修改a的
值,將收到編譯器錯誤,因為a使用const關鍵字限定,阻止更改整數(shù)變量的
值。另一方面,volatile阻止任何編譯器優(yōu)化,并表示對象的值可以通過超出
程序控制范圍的東西進行更改,因此編譯器不會對對象做出任何假設。例如:
volatileinta;當編譯器看到上述聲明時,它會避免對a做出任何假設,并在每
次迭代中從分配給變量的
33、C語言中的變量可以既是常量(const)又是易失(volatile)?
是的,可以同時使用常量和易失性。volatile和const關鍵字的最大用途之一
是在訪問GPIO寄存器時。在GPIO的情況下,如果它被配置為輸入,它的
值可以通過“外部因素'(如果開關或任何輸出設備連接到GPIO)來更改。在這
種情況下,volatile起著重要作用,并確保編譯器始終從GPIO地址讀取值
并避免做出任何假設。使用volatile關鍵字后,無論何時訪問端口,都將獲得
正確的值,但這里還有一個問題,因為指針不是const類型,因此可能是程序
更改了指針的指
34、如何在C語言中設置、清除、切換和檢查單個位?
設置第N位設置第N位意味著如果第N位為0,則將其設置為1,如果為
1,則保持不變。在C中,按位或運算符(|)用于設置整數(shù)數(shù)據(jù)類型的位。
據(jù)我們所知|(按位或運算符)計算一個新的整數(shù)值,其中每個位的位置只有當操
作數(shù)(整數(shù)類型)在該位置為1時才為1o簡而言之,如果其中任何一位為1,
則可以說兩位的“按位或”始終為1。0|0=01|0=10|1=11|1
=1設置位的算法:Number|=(1UL?
35、如何檢測兩個整數(shù)是否有相反的符號(位操作)?
讓給定的整數(shù)是a和b。如果a的符號位與b的符號位不同,則a和b的符號
位(MSB)的EX-OR將為1。換句話說,如果a和b的符號相反,a和b的
異或將是負數(shù)。示例代碼:boolCheckOppositeSign(inta,intb){boolb
RetValue=0;bRetValue=((aAb)<0);//trueifaandbhaveopposit
esignsreturnbRetValue;}
36、編寫一個高效的C程序來反轉數(shù)字的位?
有很多方法可以反轉數(shù)字的位,這里描述了三種通用的方法來反轉位。方法一
在此方法中,將檢查num的設置位并循環(huán)遍歷整數(shù)的所有位。如果發(fā)現(xiàn)nu
m的第i位被設置,那么只需將1放在tmp的((INT_BITS-1)-ith)
位置,其中INT_BITS是整數(shù)的位數(shù)。#defineCHAR_BITS8//sizeofch
aracter#defineINT_BITS(sizeof(int)*CHAR_BITS)//bitreversa
37、如何在C語言中以二進制格式打印十進制數(shù)?
參考以下代碼實現(xiàn):#defineCHAR_BITS8//sizeofcharacter#defineIN
T_BITS(sizeof(int)*CHAR_BITS)//bitsinintegervoidPrintlnBinary(unsi
gnedn){charPos=(INT_BITS-1);for(;Pos>=0;--Pos){(n&(1
?Pos)
38、下面程序的輸出是什么?
#include<stdio.h>
intmain()
intdata=16;
data=data>>1;
printf("%d\n",data);
return0;
}
上面程序的輸出是:8
39、下面程序的輸出是什么?
#include<stdio.h>
intmain()
{
intc=8八7;
printfC^dXn",c);
}
上面程序的輸出是:15
40、下面程序的輸出是什么?
#include<stdio.h>
#include<stdlib.h>
intmain()
{
void*pvBuffer=NULL;
pvBuffer=malloc(sizeof(int));
*((int*)pvBuffer)=0x00000000;
*((int*)pvBuffer)|=2;
printf("OutPut=%d",*((int*)pvBuffer))j
free(pvBuffer);
return0;
}
上面程序的輸出:2
41、編寫一個程序交換兩個數(shù)字(不使用第三個變量)?
假設a、b兩個數(shù)字,有很多方法不使用第三個變量交換兩個數(shù)字的值。方
法1(使用算術運算符):#include<stdio.h>intmain(){inta=10,b=5;
//algotoswap'a'and'b'a=a+b;//abecomes15b=a-b;//bb
ecomes10a=a-b;//tonallya
42、寫一個程序來檢查一個整數(shù)是2的寨嗎?
下面來看看如現(xiàn)編寫一個小算法來檢查2的累。如果一個數(shù)字是2的募,則
函數(shù)返回1。示例代碼1:intCheckPowerOftwo(unsignedintx){return
((x!=0)&&(!(x&(x-1))));}示例代碼2:intCheckPowerOftwo(unsig
nedintx){return(x&&(!(x&(x-1))));}
43、以下代碼的輸出是什么?
#include<stdio.h>
intmain()
{
intx=-30;
x=x<<1;
printf("%d\n",x);
}
輸出結果:未定義的行為。
44、以下代碼的輸出是什么?
ttinclude<stdio.h>
intmain()
{
intx=-30;
x=x>>1;
,,,,
printf(%dJx);
return0;
}
實現(xiàn)定義(implementation-defined)
45、編寫一個程序來計算整數(shù)中的集合位?
請參考下面代碼實現(xiàn):unsignedintNumberSetBits(unsignedintn){unsig
nedintCountSetBits=0;while(n){CountSetBits+=n&1;n?=1;}
returnCountSetBits;}
46、在C程序中應該什么時候使用指針?
在C程序中有下面情節(jié)應該使用指針:傳遞大型結構喜歡的服務器請求或響
應數(shù)據(jù)包。實現(xiàn)鏈表和二叉樹。GPIO或硬件寄存器。從函數(shù)中獲取地址或更
新值(通過引用調用)創(chuàng)建動態(tài)數(shù)組。使用函數(shù)指針創(chuàng)建回調函數(shù)。注意:除此
之外,還有很多地方需要用到指針。
47、C語言中的void或泛型指針是什么?
void指針是通用指針。它沒有關聯(lián)的數(shù)據(jù)類型,這就是為什么它可以存儲任何
類型對象的地址并類型轉換為任何類型的原因。根據(jù)C標準,指向void的指
針應具有與指向字符類型的指針相同的表示和對齊要求。void指針聲明類似
于普通指針,但不同之處在于使用void關鍵字代替數(shù)據(jù)類型。語法:void*
Pointer_Name;
48、C語言市空(或void)指針的優(yōu)點是什么?
C語言中的void指針有以下優(yōu)點:使用void指針,可以創(chuàng)建一個可以接受
任何數(shù)據(jù)類型參數(shù)的通用函數(shù)。memcpy和memmove庫函數(shù)是泛型函數(shù)的
最佳示例,使用這些函數(shù)可以將數(shù)據(jù)從源復制到目標。例如:void*memcpy
(void*dst,constvoid*src,size_tnum);void指針可以轉換為另一*
藪據(jù)類型,這就是malloc、calloc或realloc庫函數(shù)返回void*的原因。
由于void*這些函
49、什么是懸空指針?
通常,當引用對象被刪除或釋放時,會出現(xiàn)延遲指針,而不會更改指針的值。
它會產(chǎn)生問題,因為指針仍然指向不可用的內存。當用戶嘗試取消引用懸空指
針時,它會顯示未定義的行為,并且可能是分段錯誤的原因。示例代碼:#in
clude<stdio.h>#include<stdlib.h>intmain(){int*piData=NULL;//creatin
gintegerofsize10.piData=malloc(sizeo
50、什么是野指針?
在首次使用之前未正確初始化的指針稱為野指針。未初始化的指針行為是完全
未定義的,因為它可能指向某個可能導致程序崩潰的任意位置,這就是它被稱
為野指針的原因。換句話說,編程語言中沒有被編譯器或程序員初始化的每個
指針都以野指針開始。注意:通常,編譯器會警告通配指針。語法:int*pi
Data;//piDataiswildpointer
51、C語言中NULL指針是什么?
根據(jù)C標準,值為0的整數(shù)常量表達式,或轉換為void*類型的此類表達
式稱為空指針常量。如果將空指針常量轉換為指針類型,則生成的指針稱為空
指針。語法:int*piData=NULL;//piDataisanullpointer
52、什么是函數(shù)指針?
函數(shù)指針類似于其他指針,但唯一的區(qū)別是它指向函數(shù)而不是變量。換句話
說,函數(shù)指針是一種存儲函數(shù)地址的指針,這些指向的函數(shù)可以在程序中隨時
被函數(shù)指針調用。
53、如何在C語言中聲明指向函數(shù)的指針?
聲明函數(shù)指針的語法非常簡單。一開始似乎很難,但是一旦熟悉了函數(shù)指針,
它就會變得容易。函數(shù)指針的聲明類似于函數(shù)的聲明。這意味著函數(shù)指針還需
要返回類型、聲明名稱和參數(shù)列表。需要記住的一件事是,每當在程序中聲明
函數(shù)指針時,聲明名稱前面都有*(星號)符號并用括號括起來。例如:void(
*fpData)(in£);為了更好的理解,我們舉個例子來描述一下C語言中函數(shù)指
針的聲明。示例:void(*pfDisplayMessage)(constchar*);在上面的
54、函數(shù)指針可以在哪里使用?
有很多地方可以使用函數(shù)指針。通常,函數(shù)指針用于實現(xiàn)回調函數(shù)、有限狀態(tài)
機以及提供C語言中的多態(tài)特性等。
55、C語言中的數(shù)組和指針有什么區(qū)別?
數(shù)組和指針之間的一個重要區(qū)別是數(shù)組中元素的地址始終是固定的,不能在執(zhí)
行時修改地址,但對于指針,可以根據(jù)需要更改指針的地址??紤]下面的例
子:在下面的示例中,當嘗試增加數(shù)組的地址時,將得到編譯器錯誤。
56、下面C語言程序的輸出是什么(假設int大小為4個字節(jié))?
#include<stdio.h>
intmain()
int(*arr)[5][4];
//Supposeintegersize4bytes
printf("*arrsize%d",sizeof(*arr));
return0;
}
輸出結果為:*arrsize80解釋:int(*arr)[5][4]是指向數(shù)組的指針。4*5的
元素總數(shù),如果整數(shù)大小為4字節(jié),則*arr的大小將為80。
57、什么是靜態(tài)內存分配和動態(tài)內存分配?
根據(jù)C標準,有四種存儲持續(xù)時間,靜態(tài)、線程(C11)、自動和分配。存儲
期限決定了對象的生命周期。靜態(tài)內存分配:靜態(tài)分配意味著,一個對象具有
外部或內部鏈接或使用靜態(tài)存儲類聲明。它僅在程序啟動之前初始化一次,其
生命周期貫穿程序的整個執(zhí)行過程。全局和靜態(tài)變量是靜態(tài)內存分配的一個示
例。動態(tài)內存分配:在C語言中,有很多用于動態(tài)分配內存的庫函數(shù)(mall。
c、calloc或realloc,..)□動態(tài)分配內存的問題之一是它不會被編譯器未身破
壞,這意味著用戶有責任解除分配的內存。當使用內存管
58、C語言中的內存泄漏是什么?
內存泄漏是一個常見且危險的問題。這是一種資源泄漏。在C語言中,當
使用內存管理功能分配一塊內存而忘記釋放它時,就會發(fā)生內存泄漏。示例:
intmain(){char*pBuffer=malloc(sizeof(char)*20);/*Dosomework
*/return0;/*Notfreeingtheallocatedmemory*/}注意:一旦分配了內
存,分配的內存在空閑之前不會分配給另一個程序或進程。..
59、malloc和calloc有什么區(qū)別?
malloc和calloc是內存管理函數(shù)。它們用于動態(tài)分配內存?;旧希琧alloc
和malloc之間沒有實際區(qū)別,只是calloc分配的內存用0初始化。在C
語言中,calloc函數(shù)將所有分配的空間位初始化為零,但malloc不初始化分
配的內存。這兩個函數(shù)的參數(shù)數(shù)量也有所不同,malloc接受一個參數(shù),而c
alloc接受兩個。
60、realloc。函數(shù)的作用/目的是什么?
realloc()函數(shù)用于調整分配的內存塊的大小。它有兩個參數(shù),第一個是指向先
前分配的內存的指針,第二個是新請求的大小。realloc。函數(shù)首先釋放舊對
象,然后重新分配新指定的大小。如果新大小小于舊大小,則新分配內存的內
容將與先前相同,但如果新創(chuàng)建的對象中的任何字節(jié)超出舊大小,則超出大小
的值將是不確定的。語法:void*realloc(void*ptr,size_tsize);示例代
碼:#include<stdio.h>#include<stdli
61、malloc(O)的返回值是多少?
如果請求空間的大小為零,則行為將由實現(xiàn)定義。malloc的返回值可能是一
個空指針,或者它表明該大小的行為是某個非零值。標準建議不要使用指針來
訪問當大小為零時由malloc返回的對象。
62、什么是動態(tài)內存碎片?
內存管理功能保證如果內存被分配,那么它將適當?shù)嘏c任何具有基本對齊的對
象對齊?;緦R小于或等于沒有對齊規(guī)范的實現(xiàn)所支持的最大對齊。動態(tài)內
存分配的主要問題之一是碎片,基本上,碎片發(fā)生在用戶沒有有效使用內存
時。有兩種類型的碎片,外部碎片和內部碎片。外部碎片是由于空閑列表上可
用但程序無法使用的小空閑內存塊(小內存洞)造成的。有不同類型的空閑列表
分配算法可以有效地使用空閑內存塊。為了理解外部碎片,考慮一個程序有3
個連續(xù)的內存塊并且用戶釋放中間的內存塊的場景。在這種情況下,如果所需
的內存塊大于單個內存
63、C語言中的fee()函數(shù)工作如何?
當我們調用內存管理函數(shù)(malloc、calloc或realloc)時,這些函數(shù)會保留額外
的字節(jié)用于簿記。每當調用free。函數(shù)并傳遞指向已分配內存的指針時,free
()函數(shù)都會獲取簿記信息并釋放分配的內存。無論如何,如果程序更改指向已
分配地址的指針的值,則調用free。函數(shù)會給出未定義的結果。Theall
ocatedblock/+--------+---------------------.
64、如何確定分配的內存部分的大???
在C語言中,可以使用sizeof運算符計算靜態(tài)數(shù)組的大小,但沒有運算符來
計算動態(tài)分配的內存大小。主要有兩種方法可以在代碼的每個部分中獲取分配
的內存大小。創(chuàng)建一個全局變量來存儲分配的內存大小。攜帶已分配內存的長
度。示例:假設需要創(chuàng)建一個大小為n的整數(shù)數(shù)組。所以要攜帶數(shù)組的數(shù)
組長度,需要為n+1分配內存。int*piArray=malloc(sizeof(int)*(n+1)
);如果內存分配成功,則分配n(數(shù)組的大小)它的0個位置。piArray[
65、以下C語言代碼的輸出是什么?
#include<stdio.h>
#include<stdlib.h>
ttdefineALLOC_MEMORY5
intmain()
{
intloop=0;
int*ptr=malloc(ALLOC_MEMORY*sizeof(int));
if(ptr==NULL)
{
perror(ufailtoallocatememory");
return-1;
}
for(loop=0;loop<ALLOC_MEMORY;++loop)
{
*(ptr+loop)=loop;
}
printf("%d",*ptr++);
printf("%d",(*ptr)++);
printf("%d",*ptr);
printf("%d",*++ptr);
printf("%d",++*ptr);
free(ptr);
return0;
}
c
上面示例代碼輸出結果是:01223解釋:第一個printf:*ptr++意味著它
將增加地址并取消引用該地址,但這里的增量是一個后增量,所以首先和之后
取消引用,所以在基地址上你得到O(ptr指向下一個位置)。第二個printf:(*pt
r)++第一次取消引用,然后增加值,所以位置值是1是增量,所以得到2(這
里的指針沒有改變)。第三個printf:*ptr表示當指針指向該位置時取消引
用,所以得到2。第五個printf:*++ptr表示第一個指針在取消引用后遞
66、memcpy和memmove有什么區(qū)別?
這兩個副本函數(shù)都用于將n個字符從源對象復制到目標對象,但它們有一些區(qū)
另U,如下所述。如果源指針和目標指針指向的內存區(qū)域重疊,則memcpy復
制函數(shù)會顯示未定義的行為。memmove函數(shù)在重疊的情況下具有定義的行
為。因此,每當有疑問時,使用memmove代替memcpy會更安全。#incl
ude<string.h>#include<stdio.h>charstr1[50]="IamgoingfromDelhi
to
67、使用C語言在不使用庫函數(shù)的情況下實現(xiàn)反轉字符串。
字符串是字符的集合,它總是以空字符結尾,這意味著每個字符串在字符串的
末尾都包含一個空字符。例子:char*pszData="aticle";在上面的示例中,
pszData是指向字符串的指針。字符串的所有字符都存儲在一個連續(xù)的內存
中,并在字符串的最后一個空字符組成。見下表:character'a'tT'c'T
‘e'"Address0x000x010x020x03.
68、什么是字節(jié)序?
字節(jié)序是在內存中存儲數(shù)據(jù)的字節(jié)順序,它還描述了通過數(shù)字鏈路傳輸字節(jié)的
順序。在內存數(shù)據(jù)存儲中,順序取決于系統(tǒng)的字節(jié)序,如果系統(tǒng)是大字節(jié)序,
則首先存儲MSB字節(jié)(意味著在低地址),如果系統(tǒng)是小端序,則首先存儲LS
B字節(jié)(在較低的地址)。Httle-endian和big-endian系統(tǒng)的一些示例:
69、編寫一個C程序來檢查系統(tǒng)的字節(jié)順序?
下面使用C語言來編寫程序檢查系統(tǒng)的字節(jié)順序。方法一:/include<stdi
o.h>#include<stdlib.h>#include<inttypes.h>intmain(void){uint32_tu3
2RawData;uint8_t*pu8CheckData;u32RawData=0x11223344;//Assign
datapu8CheckData=(uint8_t*)
70、如何在C中將little-endian轉換為big-endian(反之亦然)?
下面下面是編寫C程序來將little-endian轉換由big-endian(反之亦然)。方
法一:#include<stdio.h>#include<stdlib.h>#include<inttypes.h>//Func
tiontochangetheendianessuint32_tChangeEndianness(uint32_tu32Val
ue){uint32_tu32Result=0;u3
71、編寫一個C程序來檢查一個數(shù)是否是素數(shù)?
素數(shù)是一個正的自然數(shù),它的值大于1,并且只有兩個因數(shù)1和數(shù)本身。使
用除法檢查素數(shù)的算法開始步驟1->取數(shù)n步驟2T將數(shù)字n除以(2,
n-1)或(2,n/2)或(2,sqrt(n))。步驟3-如果數(shù)n可被(2,n-1)或(2,
n/2)或(2,sqrt(n))之間的任何數(shù)整除,則它不是素數(shù)步驟4-如果它不能
被(2,n-1)或(2,n/2)或(2,sqrt(n))之間的任何數(shù)整除,則它是質數(shù)最后
停止示例代碼:
72、如何在不使用sizeof運算符的情況下在C中計算出數(shù)組的大???
方法一:#include<stdio.h>intmain(intargc,char*argv[]){intiTotalEle
merit=0;intaiData[={10,20,30,40,50,60};//Calculatenumberso
felementsusingpointerarithmaticiTotalElement=*(&aiData+1)-aiDa
73、.何在不使用sizeof運算符的情況下在C中計算出結構體的大???
方法一:當增加指針時,指針會增加一塊內存(內存塊取決于指針數(shù)據(jù)類型),
所以這里將使用這種技術來計算sizeof結構。首先,創(chuàng)建結構。創(chuàng)建一個指
向結構的指針并分配NULL指針。將指針增加到1。#include<stdio.h>#in
elude<stdlib.h>typedefstruct{charName[12];intAge;floatWeight;int
RollNumber;
74、結構填充是什么?
在結構或聯(lián)合的情況下,編譯器在結構或聯(lián)合的成員之間插入一些額外的字節(jié)
用于對齊,這些額外未使用的字節(jié)稱為填充字節(jié),這種技術稱為填充。填充以
內存為代價提高了處理器的性能。在結構或聯(lián)合數(shù)據(jù)成員中,按照最高字節(jié)成
員的大小對齊,以防止性能損失。注意:處理器架構要求的數(shù)據(jù)類型對齊,而
不是語言。
75、在C語言中如何將二維數(shù)組作為參數(shù)傳遞?
在C語言中,有很多方法可以將二維數(shù)組作為參數(shù)傳遞。在下面的部分中,
將描述幾種將二維數(shù)組作為參數(shù)傳遞給函數(shù)的方法。使用指針將二維數(shù)組傳遞
給c中的函數(shù)多維數(shù)組的第一個元素是另一個數(shù)組,當傳遞一個二維數(shù)組時,
它將被拆分為指向數(shù)組的指針。例如如果intaiData[3][3],是一個2D整數(shù)
數(shù)組,它將被拆分為指向3個整數(shù)數(shù)組的指針(int(*)[3])oinclude<stdio.
h>//Sizeofthecreatedarray#define
76、枚舉和宏有什么區(qū)別?
枚舉和宏的區(qū)別:與宏相比,枚舉增加工代碼的可讀性并且易于調試。枚舉的
所有元素組合在一起,宏是不可能的。示例://constantcreatedbymacro,
#defineMON0#defineTUE1#defineWED2#defineTHU3#defineF
RI4#defineSAT5#defineSUN6//constantcreatedbyenum,typedef
enumDays{Mon,Tue,
77、如何刪除沒有頭指針的鏈表中的節(jié)點?
通過給定的指針直接刪除節(jié)點沒有實際的解決方案,需要做一些技巧。通過給
定勺要刪除的指針將數(shù)據(jù)從下一個節(jié)點復制到當前節(jié)點并刪除下一個節(jié)點。參
考示例:〃GettheAddressofthenextnodeNodePointertemp=Node
->pNextNode;//GetthedataofnextnodeNode->iData=temp->iData;//
GettheAddressofnexttonextno
78、如何在C語言中定義多行宏?
請參閱下面的示例,其中交換兩個變量的值。#include<stdio.h>#definesw
ap(x,y,T)do{Ttemp=(*x);(*x)=(*y);(*y)=temp;}while(0)intmai
n(void){inta=5;intb=9;printf("Valueofaandbbeforeswaping");
79、C語言中的遞歸是什么?
遞歸是函數(shù)調用自身的過程,直接或間接調用自身的函數(shù)稱為遞歸函數(shù)。遞歸
函
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年中國后備式UPS市場調查研究報告
- 2025年中國印花PV絨市場調查研究報告
- 暑期培訓入學協(xié)議書
- 直播解約協(xié)議書模板
- 回饋股東福利協(xié)議書
- 私人庫房出租合同協(xié)議
- 工地保安臨時合同協(xié)議
- 銷售商務合同協(xié)議
- 鄭州租賃合同協(xié)議
- 外賣衣服轉讓合同協(xié)議
- 2024年5月廣東省公務員考試公安聯(lián)考結構化面試真題試題試卷答案解析
- 2025-2030中國醫(yī)療領域的射頻識別設備(RFID)行業(yè)市場發(fā)展趨勢與前景展望戰(zhàn)略研究報告
- 2025至2030中國車載OLED屏市場未來前景展望及運行態(tài)勢剖析報告
- 2025-2030中國生物醫(yī)藥行業(yè)市場深度調研及發(fā)展趨勢與投資前景預測研究報告
- 貿易公司員工管理制度
- 專利代理師高頻題庫新版2025
- 肝硬化護理新進展
- 2025年全國國家版圖知識競賽題庫及答案(中小學組)
- DB15-T 1339-2025 風電場機組布置技術規(guī)范
- 養(yǎng)老院護理九防內容課件
- CNASGL011-202X實驗室和檢驗機構內部審核指南征求意見稿
評論
0/150
提交評論