  | 
      
        
          11樓
          巨大八爪鱼
          2016-6-24 11:25
           
          
           
         
        請看下面這句話: 
int *a = (int *)malloc(2 * sizeof(int)); 
這句代碼動態分配了8位元組的內存,然後用指針變量p保存該內存塊的首地址。然而我們知道int *型指針只能操作4位元組的內存,也就是說*a只能訪問到該內存塊的前4個字節。 
不過呢,指針可以進行加減運算,所以我們可以用*(a+1)來訪問後4個字節。當然a[1]也是可以的。 
最後free(a)釋放的是整個8位元組的內存塊,而非sizeof(int)=4位元組。 
       | 
    
    
        | 
      
        
          12樓
          巨大八爪鱼
          2016-6-24 11:33
           
          
           
         
        同樣的道理,雖然BITMAPINFO結構的第二個成員bmiColors數組只有一個元素,但是我們完全可以用下面的方法搞出多個元素來: 
BITMAPINFO *p = (BITMAPINFO *)malloc(sizeof(BITMAPINFOHEADER) + n * sizeof(RGBQUAD)); 
其中n可以為任意自然數,包括0,表示調色板中的顏色數目。 
然後我們就可以使用p->bmiColors[3]這樣大於0的下標了。 
最後free(p)也是釋放整個內存空間,而不是只是sizeof(BITMAPINFO)。 
       | 
    
    
        | 
      
        
          13樓
          巨大八爪鱼
          2016-6-24 11:36
           
          
           
         
        所以,BITMAPINFO這個結構體類型一般不拿來直接定義變量,而是常使用其指針類型。 
另外,對於之前提到的int *a,我們也可以通過強制類型轉換來一次性訪問8個字節: 
*(long long *)a 
       | 
    
    
        | 
      
        
          14樓
          巨大八爪鱼
          2016-6-24 13:54
          
          
           
         
        位圖數據第二維長度的確定方法:使用<math.h>中的ceil函數。 #include <math.h> #include <stdio.h>
  int main(void) {     int i, n;     for (i = 0; i < 24; i++)     {         n = (int)ceil(i / 4.0) * 4;         printf("%d: %d\n", i, n);     }     return 0; } 【輸出】 0: 0 1: 4 2: 4 3: 4 4: 4 5: 8 6: 8 7: 8 8: 8 9: 12 10: 12 11: 12 12: 12 13: 16 14: 16 15: 16 16: 16 17: 20 18: 20 19: 20 20: 20 21: 24 22: 24 23: 24
  
       | 
    
    
        | 
      
        
          15樓
          巨大八爪鱼
          2016-6-24 14:33
          
          
           
         
        
       |