2011-03-21 57 views
0

我試圖通過一些類的實例的工作,並已得到粘貼在以下:Ç網格使用指針和malloc的

陣列網格應 具有與表示 單元的列中的每個條目的長度的寬度。有一些被佔用的單元格的列應該是長度爲height的 malloc'ed字符數組。

與給定的標頭:

void grid(char **grid, int width, int height) 

網格在另一個文件中定義爲:

char **grid; 

正如我所說我已經得到了卡在使用malloc,我現在有:

int x; 
*grid = malloc(width * sizeof(char)); 

     for(x = 0; x < width; x++){ 
      grid[x] = malloc(height * sizeof(char)); 
     } 

任何人都可以看看給我一些指示正確的方法來完成「列有s OME佔用細胞應是長度高度的 malloc分配字符數組「,正如我不理解如何行:

網格[X] = malloc的(高度* 的sizeof(char)的);

相當於焦炭的

感謝

回答

4

在C中,數組是數組的第一個元素的pointer。所以一個數組只是一個內存塊,數組變量指向這個內存塊中的第一個元素。

malloc()保留指定大小的新內存塊。要知道類型的大小(即存儲一個該類型變量所需的字節數),可以使用sizeof運算符。因此一個字符需要sizeof(char)字節,因此高度字符需要height * sizeof(char)

因此,通過malloc()調用您分配一個內存塊來存儲數組的所有元素,而malloc()將返回一個指針到第一個元素上。

使用C的數組變量定義(指向第一個元素的指針),可以將malloc(...)的結果賦值給數組變量。

1

使用此數組:

grid = malloc(width * sizeof(char *)); 

您想爲width指針分配空間爲char - 然後你正確地分配個人指針height字符在循環中。

使用的typedef使得這一點更加明顯:

typedef char * charpointer; 
charpointer * grid = malloc(width * sizeof(charpointer)); 
4

char** grid;是指針的指針。

grid = malloc(width* sizeof(char*)) ; // Statement 1 

for(int i=0; i<height; ++i) 
{ 
    grid[i] = malloc(height) ; // Statement 2 
} 

瞭解char** -> char* -> char。所以首先需要保留地址等於寬度。通過聲明1,實現。現在,這些索引中的每一個都應該指向一個存儲位置,其中存儲位置保存了高度個字符,並且通過聲明2來實現。


圖示表示聽起來比描述更清晰。希望有所幫助! Diagram

+0

+1爲圖 – 2011-03-21 21:00:52

-1
  1. 首先爲[width]字符指針數組分配空間。因此,代替爲[width]字符分配空間的*grid = malloc(width * sizeof(char));,應該使用*grid = malloc(width * sizeof(* char));(不同之處在於char是一個字節,而char指針是int(通常是32位,但取決於體系結構)
  2. 在循環中,每次你分配(一個數組)[hight]字符並將指針存儲在你在(1)中分配的指針之一中,所以grid [x]實際上指向一個分配的字符緩衝區(這是你的數組)

希望我明確

+0

@Downvoter經過六月份 - 。護理解釋? – MByD 2011-09-25 00:51:49