- 相關(guān)推薦
精心整理的關(guān)于c語(yǔ)言?嫉墓P試題
一、 想說(shuō)一說(shuō)關(guān)于集中數據類(lèi)型的sizeof問(wèn)題,這題出現率40%
sizeof就是求在內存總占多少字節的問(wèn)題,最基本的char 1字節 short 2字節 int 4字節
任何的指針都是4字節 sizeof(數組名)=數組占的大小(這里必須注意雖然數組名可作為只想數組首地址的指針,但是sizeof(數組名)求得的不是指針的大小,而是數組大小)
還有就是sizeof(結構體) sizeof(聯(lián)合體)
舉兩個(gè)例子 struct stu {
Char a;
Int b;
Char c;
};
struct teacher {
Char a;
Char c;
Int b;
};
Sizeof (stu) =12 ;內存中這樣存儲 char 空空空 int char 空空空
內存4字節對其問(wèn)題
Sizeof (teacher) =8 ;內存中這樣存儲 char char空空 int
關(guān)于聯(lián)合體
Union std{
Char a[10];
Int b[3];
}
Sizeof(std)=12; 聯(lián)合體公用內存,取其中所占內存最大的元素為聯(lián)合體所占內存
以下為Windows NT下的32位C++程序,請計算sizeof的值
char str[] = “Hello” ;
char *p = str ;
int n = 10;
1. 請計算
sizeof (str ) = 6
sizeof ( p ) = 4
sizeof ( n ) = 4
void Func ( char str[100])
{
請計算
sizeof( str ) = 4
}
void *p = malloc( 100 );
請計算
sizeof ( p ) = 4
還有位段的問(wèn)題如下
分析:
struct bit
{ int a:3;
int b:2;
int c:3;
};
int main()
{
bit s;
char *c=(char*)&s;
cout<
*c=0x99;
cout << s.a <
int a=-1;
printf("%x",a);
return 0;
}
輸出為什么是
4
1
-1
-4
ffffffff
因為0x99在內存中表示為 100 11 001 , a = 001, b = 11, c = 100
當c為有符合數時(shí), c = 100, 最高1為表示c為負數,負數在計算機用補碼表示,所以c = -4;同理
b = -1;
當c為有符合數時(shí), c = 100,即 c = 4,同理 b = 3
位域 :
有些信息在存儲時(shí),并不需要占用一個(gè)完整的字節, 而只需占幾個(gè)或一個(gè)二進(jìn)制位。例如在存放一個(gè)開(kāi)關(guān)量時(shí),只有0和1 兩種狀態(tài), 用一位二進(jìn)位即可。為了節省存儲空間,并使處理簡(jiǎn)便,C語(yǔ)言又提供了一種數據結構,稱(chēng)為“位域”或“位段”。所謂“位域”是把一個(gè)字節中的二進(jìn)位劃分為幾個(gè)不同的區域, 并說(shuō)明每個(gè)區域的位數。每個(gè)域有一個(gè)域名,允許在程序中按域名進(jìn)行操作。 這樣就可以把幾個(gè)不同的對象用一個(gè)字節的二進(jìn)制位域來(lái)表示。一、位域的定義和位域變量的說(shuō)明位域定義與結構定義相仿,其形式為:
struct 位域結構名
{ 位域列表 };
其中位域列表的形式為: 類(lèi)型說(shuō)明符 位域名:位域長(cháng)度
例如:
struct bs
{
int a:8;
int b:2;
int c:6;
};
位域變量的說(shuō)明與結構變量說(shuō)明的方式相同。 可采用先定義后說(shuō)明,同時(shí)定義說(shuō)明或者直接說(shuō)明這三種方式。例如:
struct bs
{
int a:8;
int b:2;
int c:6;
}data;
說(shuō)明data為bs變量,共占兩個(gè)字節。其中位域a占8位,位域b占2位,位域c占6位。對于位域的定義尚有以下幾點(diǎn)說(shuō)明:
1. 一個(gè)位域必須存儲在同一個(gè)字節中,不能跨兩個(gè)字節。如一個(gè)字節所?臻g不夠存放另一位域時(shí),應從下一單元起存放該位域。也可以有意使某位域從下一單元開(kāi)始。例如:
struct bs
{
unsigned a:4
unsigned :0 /*空域*/
unsigned b:4 /*從下一單元開(kāi)始存放*/
unsigned c:4
}
在這個(gè)位域定義中,a占第一字節的4位,后4位填0表示不使用,b從第二字節開(kāi)始,占用4位,c占用4位。
2. 由于位域不允許跨兩個(gè)字節,因此位域的長(cháng)度不能大于一個(gè)字節的長(cháng)度,也就是說(shuō)不能超過(guò)8位二進(jìn)位。
3. 位域可以無(wú)位域名,這時(shí)它只用來(lái)作填充或調整位置。無(wú)名的位域是不能使用的。例如:
struct k
{
int a:1
int :2 /*該2位不能使用*/
int b:3
int c:2
};
從以上分析可以看出,位域在本質(zhì)上就是一種結構類(lèi)型, 不過(guò)其成員是按二進(jìn)位分配的。
位域的使用位域的使用和結構成員的使用相同,其一般形式為: 位域變量名•位域名 位域允許用各種格式輸出。
main(){
struct bs
{
unsigned a:1;
unsigned b:3;
unsigned c:4;
} bit,*pbit;
bit.a=1;
bit.b=7;
bit.c=15;
pri
二、 關(guān)于動(dòng)態(tài)申請內存的問(wèn)題 這題出現率極高,60%不為過(guò)
void GetMemory(char *p)
{
p = (char *)malloc(100);
}
void Test(void)
{
char *str = NULL;
GetMemory(str);
strcpy(str, "hello world");
printf(str);
}
請問(wèn)運行Test函數會(huì )有什么樣的結果?
答:試題傳入GetMemory( char *p )函數的形參為字符串指針,在函數內部修改形參并不能真正的改變傳入形參的值,執行完
char *str = NULL;
GetMemory( str );
后的str仍然為NULL;
char *GetMemory(void)
{
char p[] = "hello world";
return p;
}
void Test(void)
{
char *str = NULL;
str = GetMemory();
printf(str);
}
請問(wèn)運行Test函數會(huì )有什么樣的結果?
答:可能是亂碼。 char p[] = "hello world";
return p;
的p[]數組為函數內的局部自動(dòng)變量,在函數返回后,內存已經(jīng)被釋放。這是許多程序員常犯的錯誤,其根源在于不理解變量的生存期。
void GetMemory2(char **p, int num)
{
*p = (char *)malloc(num);
}
void Test(void)
{
char *str = NULL;
GetMemory(&str, 100);
strcpy(str, "hello");
printf(str);
}
請問(wèn)運行Test函數會(huì )有什么樣的結果?
答:
(1)能夠輸出hello
(2 )Test函數中也未對malloc的內存進(jìn)行釋放。
(3)GetMemory避免了試題1的問(wèn)題,傳入GetMemory的參數為字符串指針的指針,但是在GetMemory中執行申請內存及賦值語(yǔ)句
*p = (char *) malloc( num );
后未判斷內存是否申請成功,應加上:
if ( *p == NULL )
{
...//進(jìn)行申請內存失敗處理
}
void Test(void)
{
char *str = (char *) malloc(100);
strcpy(str, “hello”);
free(str);
if(str != NULL)
{
strcpy(str, “world”);
printf(str);
}
}
請問(wèn)運行Test函數會(huì )有什么樣的結果?
答:執行
char *str = (char *) malloc(100);
后未進(jìn)行內存是否申請成功的判斷;另外,在free(str)后未置str為空,導致可能變成一個(gè)“野”指針,應加上:
str = NULL;
三、基本關(guān)鍵字的提問(wèn)
?嫉
Static extern volatile const register
register 是把一個(gè)變量聲明為寄存器變量,和auto相對,auto是讓編譯器自動(dòng)決定那些變量放在寄存器里,顯然讓編譯器去決定更合理,所以這個(gè)關(guān)鍵字不常用,而聲明變量時(shí)不寫(xiě)auto的話(huà)則自動(dòng)會(huì )成為auto變量, int a; 和auto int a;效果是一樣的,這兩個(gè)只需要了解。
【精心整理的c語(yǔ)言?嫉墓P試題】相關(guān)文章:
華為C語(yǔ)言筆試題12-12
華為筆試題(C語(yǔ)言)12-10
基礎C++/C語(yǔ)言筆試題分享11-21
小升初《水滸傳》的?贾R整理06-27
廣告公司?脊P試題08-10
小升初語(yǔ)文?急嬉粼囶}歸納08-10
yahoo在線(xiàn)筆試題(c語(yǔ)言)12-12
C語(yǔ)言筆試試題及答案07-31
c語(yǔ)言筆試題目及答案08-17
投資顧問(wèn)面試?脊P試題分享!11-19