1. 程式人生 > >C++筆試、面試、基礎問題筆記

C++筆試、面試、基礎問題筆記

一、sizeof和strlen

strlen所作的僅僅是一個計數器的工作,它從記憶體的某個位置(可以是字串開頭,中間某個位置,甚至是某個不確定的記憶體區域)開始掃描,直到碰到第一個字串結束符'/0'為止,然後返回計數器值。

1.

char* p = new char[100];//sizeof(p)的結果為4
int* p = new int[100];//sizeof(p)的結果也為4

2.

char D1[23];//sizeof(D1)為23
int D2[23];//sizeof(D2)為92(23*4)

注意:sizeof()得到的分配的記憶體的位元組數,和是否使用無關,例如,char a[8]={'a','b'},則sizeof(a)的值仍為8。

3.  

char ss[] = "0123456789";
sizeof(ss) 結果 11 ===》ss是陣列,計算到/0位置,因此是10+1
4.
char str0[8] = { 'a', 'b', 'c', 'd', 'e', 'f', 'i', 'g' };
char str1[] = "abcdefig";
cout << strlen(str0) << endl;//因為沒有 /0 結尾,所以strlen的返回不可知
cout << sizeof(str0) << endl;//結果為8
cout << strlen(str1) << endl;//結果為8
cout << sizeof(str1) << endl;//結果為9,會自動加/0結尾
由以上知,strlen計算的是實際值,而sizeof是實際值+1
int a[] = { 1,2 };
cout << sizeof(a) << endl;//結果為8
char str2[] = "01234/056789";
char str3[] = "abcse/0fgkij";
cout << strlen(str2) << endl;//結果為12
cout << strlen(str3) << endl;//結果為12

總結:動態分配的陣列不能用sizeof()來確定陣列的位元組大小。

二、menset()函式

函式原型是:void *memset(void *s, int ch, size_t n);

首先menset()是以位元組為單位對初始化空間進行初始化的。所以說,對於char型別可初始化為任意值,而整形陣列只能初始化為'\0'也就是NULL,ASCII碼值為0.(數字 0的ASCII碼值為48,A為65,a為97)。

memset(iBuf, 48, sizeof(char)* 10);  //ibuf為char型別,則把記憶體置為0

如下例子,

// 對整型陣列進行初始化  
int iBuf[10];
memset(iBuf, 0, sizeof(int)* 10);  
for (int i = 0; i < 10; ++i)
{
	cout<< iBuf[i];
}
輸出結果為 0000000000

// 對字元型陣列進行初始化  
char iBuf[10];
memset(iBuf, 0, sizeof(char)* 10);  //
for (int i = 0; i < 10; ++i)
{
	cout<< iBuf[i];
}
輸出結果為 空,若改為cout<<(int)iBuf[i];
則結果為 0000000000

// 對字元型陣列進行初始化  
char iBuf[10];
memset(iBuf, 65, sizeof(char)* 10);  //
for (int i = 0; i < 10; ++i)
{
	cout<< iBuf[i];
}
輸出結果為 AAAAAAAAAA 若改為cout<<(int)iBuf[i];
則結果為65656565656565656565

上面的例子之所以沒有出錯就是因為初始化為0(指ASCII碼值為0,即NULL),但是如果初始化為1,那麼因為int一般是4個位元組,那麼相當於將一個int元素初始化成了00000001 00000001 00000001 00000001,這樣對於一個int元素肯定不是1,而是一個很大的數,結果出乎意料。

即當memset(, 0 ,)時,對於字元型置為NULL,對於整形則置為0。