程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> sizeof那道筆試題的秘密

sizeof那道筆試題的秘密

編輯:關於C語言

    最近做了一套軟件公司的筆試題,其中有一題要求給定數組名,求數組的元素個數,當時沒有做出來,後來仔細思考和分析了一番,有了一些新的收獲,分享於此~~

筆試題】:

  1. 請寫出一個宏,計算數組的元素個數。  
  2.  
  3. #define countof(arr) ...  
  4.  
  5. 例如: int a[10], float b[20], char c[100]  
  6.  
  7. 調用:  
  8. countof(a),返回值為10  
  9. countof(b),返回值為20  
  10. countof(c),返回值為100  

答案】: #define countof(arr) sizeof(arr)/sizeof(arr[0])

小問題】:大家知道為什麼試題要求寫一個宏,而不是要求寫一個類似下面的一個函數呢?

int countof(void *arr)
{
   
}
大家可以測試一下,如果在上面這個函數中實現return sizeof(arr)/sizeof(arr[0]),我們能不能達到最終的期望結果?

---------------------------------------------------------
看下面答案前請大家先思考幾分鐘
---------------------------------------------------------

答案】:不能實現,因為sizeof是在編譯時計算結果,而不支持在運行時計算結果,因此,如果在函數中寫入sizeof(arr),該句子只會返回指針類型所占用的字節數,即4個字節(32位操作系統)。


測試練習】,大家看看下面這段代碼的輸出結果是什麼?

  1. #include <iostream>  
  2.  
  3. int getNum(void *pArr)  
  4. {  
  5.     return sizeof(pArr);  
  6. }  
  7.  
  8. int _tmain(int argc, _TCHAR* argv[])  
  9. {  
  10.     /** 本測試說明:sizeof操作符作用於靜態數組時返回整個數組的全部存儲字節數 */   
  11.     int myArr[10];  
  12.     std::cout << "sizeof(int): " << sizeof(int) << std::endl;  
  13.     std::cout << "myArr : " << sizeof(myArr) << std::endl;  
  14.  
  15.     /** 本測試說明:sizeof操作符不能返回動態分配的數組的字節數 */   
  16.     int *pTest = new int(10);  
  17.     std::cout << "pTest : " << sizeof(pTest) << std::endl;  
  18.  
  19.     /** 本測試說明:sizeof計算形參得到的結果 —— 指針類型的字節數 */   
  20.     int myParam[10];  
  21.     char myChar[10];  
  22.     std::cout << "getNum(myParam) :" << getNum(myParam) << std::endl;  
  23.     std::cout << "getNum(myChar ) :" << getNum(myChar) << std::endl;  
  24.  
  25.     getchar();  
  26.     getchar();  
  27.  
  28.     return 0;  

結果】:

  1. sizeof(int): 4  
  2. myArr : 40  
  3. pTest : 4  
  4. getNum(myParam) :4  
  5. getNum(myChar ) :4 


附】:

下面是sizeof的MSDN上的解釋。

The sizeof keyword gives the amount of storage, in bytes, associated with a variable or a type (including aggregate types). This keyword returns a value of type size_t.

sizeof關鍵詞給出了存儲傳入的變量或者類型(包括聚合類型)所需要的字節數。該關鍵詞返回size_t類型的變量。

When applied to a structure type or variable, sizeof returns the actual size, which may include padding bytes inserted for alignment. When applied to a statically dimensioned array, sizeof returns the size of the entire array. The sizeof operator cannot return the size of dynamically allocated arrays or external arrays.

當應用到一個結構類型或變量,sizeof返回實際的大小,這可能包括為了字節對齊而填充的字節。當應用於靜態維數組,sizeof返回整個數組的大小。 sizeof運算符不能返回動態分配的數組或外部的數組的大小。

 

 

本文出自 “對影成三人” 博客,請務必保留此出處http://ticktick.blog.51cto.com/823160/318727

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved