2015-05-11 69 views
0

我正在研究一個涉及生成隨機圖的鄰接矩陣的C程序。這裏是源代碼的一個片段:矩陣的大小沒有正確評估

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

#include "test.h" 

int main() 
{ 
    int **A = create_matrix(4, 3); 
    destory_matrix(A); 
    return 0; 
} 

int** create_matrix(int size, int seed) 
{ 
    // Allocate space for matrix 
    int **A = malloc(size * size * sizeof(int)); 

    for (int r = 0; r < size; r++) { 
     A[r] = malloc(size * sizeof(int)); 
    } 

    // Fill entries 
    for (int i = 0; i < size; i++) { 
     for (int j = 0; j < size; j++) { 
      A[i][j] = seed * (i + 1) * (j + 1); 
     } 
    } 

    return A; 
} 

void destory_matrix(int **A) 
{ 
    int size = sizeof(A[0])/sizeof(int); 

    for (int r = 0; r < size; r++) { 
     free(A[r]) 
    } 

    free(A); 
} 

碼的這部分是負責創建矩陣(所述create_matrix()功能)和free'ing存儲器(destroy_matrix())。我在看destroy_matrix(),並注意到當傳入一個4x4矩陣時,變量大小評估爲2,而不是4.任何人都可以解釋爲什麼發生這種情況?

回答

1

我想你對sizeof運營商有一個基本的誤解。通常,它不能用於獲取動態分配的複合對象的大小。運算符sizeof根據操作數的類型向您返回大小。在你的情況下,操作數的類型是int *。我猜你正在64位系統上運行。所以sizeof任何指針是8.因此,您的size變量將總是是2,無論矩陣的大小。

1

應用於指針的sizeof運算符返回指針類型的大小,而不是指向它指向的任何分配內存的大小。

這是C中數組類型和指針類型之間的主要區別之一(注意:數組可以衰減爲指針)。應用於靜態指定數組類型(例如int foo[n];)的sizeof將以字節爲單位獲取數組大小。由於您的字大小可能是8個字節(64位),指針的大小將是8個字節,並且如果sizeof(int)是4個字節(32位),則您有8/4 = 2;如果sizeof(int)是4個字節

如果需要運行時大小的堆分配矩陣,例如,您需要考慮一些其他方式來存儲矩陣的維數。一個存儲維度的結構和一個指向分配內存的指針。不過,最好避免可能的堆碎片。

試試這個,如果你有C99:

int n = 4, m = 5; 
int (*A)[n] = malloc(m * sizeof A[0])); 
free(A); 

這種分配的int[n]m長度數組作爲一個單獨的塊,所以你可以做size_t n = sizeof(A)/sizeof(A[0]);得到一個維(n),但你需要存儲m如果你想迭代正確。