0%

(C)(C++)陣列大小sizeof()

  • sizeof( )是一個編譯時期的運算子,而非執行時期的運算子,所以當你程式編譯完成時,其值就已經決定了。

    • CPU/ OS 32-Bits

        int gIntArray[10];
        char gCharArray[10];
        void main(void)            
        {            
            printf("sizeof(gIntArray): %d", sizeof(gIntArray));            
            // 10 * 4 bytes
            printf("sizeof(gIntArray)/sizeof(gIntArray[0]): %d", sizeof(gIntArray)/sizeof(gIntArray[0]));
            // 10
            printf("sizeof(gIntArray)/sizeof(int): %d", sizeof(gIntArray)/sizeof(int));
            // 10
      
            printf("sizeof(gCharArray): %d", sizeof(gCharArray));            
            // 10 * 1 bytes
            printf("sizeof(gCharArray)/sizeof(gCharArray[0]): %d", sizeof(gCharArray)/sizeof(gCharArray[0]));
            // 10
            printf("sizeof(gCharArray)/sizeof(char): %d", sizeof(gCharArray)/sizeof(char));
            // 10
        }
      
  • 陣列大小的計算僅適用於靜態陣列,若是當成參數傳給 Function,Function收到的只是一個指標

    • CPU/ OS 32-Bits

        int gIntArray[10];
        char gCharArray[10];
        void main(void)            
        {
            function(gIntArray, gCharArray);            
        }
        void function (int intArray[], char charArray[])
        {
            printf("sizeof(intArray): %d", sizeof(intArray));            
            // pointer 4 bytes
            printf("sizeof(intArray)/sizeof(intArray[0]): %d", sizeof(intArray)/sizeof(intArray[0]));
            // 1 = (pointer 4 bytes) / (int 4 bytes)
            printf("sizeof(intArray)/sizeof(int): %d", sizeof(intArray)/sizeof(int));
            // 1 = (pointer 4 bytes) / (int 4 bytes)
      
            printf("sizeof(charArray): %d", sizeof(charArray));            
            // pointer 4 bytes
            printf("sizeof(charArray)/sizeof(charArray[0]): %d", sizeof(charArray)/sizeof(charArray[0]));
            // 4 = (pointer 4 bytes) / (char 1 byte)
            printf("sizeof(charArray)/sizeof(char): %d", sizeof(charArray)/sizeof(char));
            // 4 = (pointer 4 bytes) / (char 1 byte)
        } 
      
    • CPU/ OS 64-Bits

        int gIntArray[10];
        char gCharArray[10];
        void main(void)            
        {
            function(gIntArray, gCharArray);            
        }
        void function (int intArray[], char charArray[])
        {
            printf("sizeof(intArray)/sizeof(intArray[0]): %d", sizeof(intArray)/sizeof(intArray[0]));
            // 2 = (pointer 8 bytes) / (int 4 bytes)    
      
            printf("sizeof(charArray)/sizeof(charArray[0]): %d", sizeof(charArray)/sizeof(charArray[0]));
            // 8 = (pointer 8 bytes) / (char 1 byte)
        }
      
  • 所以並無法計算陣列的大小,一般解決的辦法是在呼叫前先計算好陣列大小,然後當成參數一併傳給 Function

    • CPU, OS 32-Bits

        int gInitArray[10];
        char gCharArray[10]
      
        void main(void)            
        {
            function(gIntArray, sizeof(gIntArray)/sizeof(gIntArray[0]));            
        }
        void function (int intArray[], int length)
        {
            printf("size of intArray: %d", length * sizeof(intArray[0]));
            // 10 * 4 bytes
        }