2010-02-12 81 views
1

對於一個賦值,我必須爲一個結構分配一塊連續的內存塊,但我首先嚐試使用一個二維數組,首先嚐試它,看看我是否正確理解它。本書中的示例爲指針數組(行)創建了一塊內存塊,然後初始化列並將指針指向它們。這個例子是:連續內存塊的動態分配(malloc)

int **CreateInt2D(size_t rows, size_t cols) 
{ 
    int **p, **p1, **end; 
    p = (int **)SafeMalloc(rows * sizeof(int *)); 
    cols *= sizeof(int); 
    for (end = p + rows, p1 = p; p1 < end; ++p1) 
     *p1 = (int *)SafeMalloc(cols); 
    return(p); 
} 

void *SafeMalloc(size_t size) 
{ 
    void *vp; 

    if ((vp = malloc(size)) == NULL) { 
     fputs("Out of mem", stderr); 
     exit(EXIT_FAILURE); 
    } 
    return(vp); 
} 

我基本上需要做的是上面的代碼,除了使它成爲一個連續的內存塊。約束是我只允許調用一次malloc,然後我必須使用指針數學來知道要初始化指針。所以,我想我會初始化內存不夠用一樣的東西:

int *createInt2D(size_t rows, size_t cols) 
{ 
    malloc(rows * sizeof(int *) + (row + cols) * sizeof(int)); 
} 

但這似乎並不完全正確,因爲我想我將不得不類型轉換無效*從malloc返回,但它是爲int的組合INT *。所以我不太確定我是否在正確的軌道上。思考?

回答

2

如果你想要一個連續的數組,你應該malloc(rows * cols * sizeof(int))

,那麼你會獲得arr[x, y],如:

arr[x * cols + y] 
0

無需通過int *規模倍增。這隻用於分配行的指針。行和列的總和也一樣。只要分配(rows * cols)* sizeof就可以分配任何結構。

1

你是在正確的軌道上。 malloc返回的塊保證正確對齊int *或int;你可以使用它。類型轉換不是一次性操作。

如果您打算僅使用array[row, col]尋址,則可以通過不爲行指針分配額外空間。如果您希望能夠使用array[row]來獲得int *列列表,則必須在分配中包含列指針的空間。

希望這足以幫助您鍛鍊身體。

+0

但是,如何將該內存塊劃分爲列以及指向這些列的數組。 – Crystal 2010-02-12 08:03:20

1
malloc((row * cols) * sizeof(int)); 

它是行*列是二維數組中的元素數量,而不是行+列數。