我有一個二維指標陣列:
typedef struct Cell{
Position p;
unsigned int value;
} Cell;
typedef struct Position{
unsigned int x;
unsigned int y;
} Position;
int size = 4;
Cell ***cells = malloc(sizeof(Cell**) * size);
int i,j;
for(i = 0; i < size; i ){
cells[i] = malloc(sizeof(Cell*) * size);
for(j = 0; j < size; j ){
cells[i][j] = malloc(sizeof(Cell));
}
}
我現在要做的是用指向單元格的指標填充這個陣列,并初始化這些單元格以包含值 0,如下所示:
for(i = 0; i < size; i ){
for(j = 0; j < size; j ){
Position p = {i,j};
Cell c = {p, 0};
cells[i][j] = &c; //This doesn't work
}
}
正如您已經知道的那樣,將 c 的地址寫入指標 cells[i][j] 并不理想,因為現在每個指標都指向同一個地址。但是我不知道如何用指向各個地址的指標填充這個陣列。
我試過這樣的事情:
cells[i][j]->value = 0;
這當然也行不通。誰能給我一個關于如何解決我的問題的提示?
uj5u.com熱心網友回復:
我不知道你為什么說cells[i][j]->value = 0;不起作用,我相信它應該。
這應該可以設定所有成員。
Cell ***cells = malloc(sizeof(Cell**) * size);
for(i = 0; i < size; i ){
cells[i] = malloc(sizeof(Cell*) * size);
for(j = 0; j < size; j ){
cells[i][j] = malloc(sizeof(Cell));
cells[i][j]->p.x = i;
cells[i][j]->p.y = j;
cells[i][j]->value = 0;
}
}
uj5u.com熱心網友回復:
您已經得到了答案,但我認為沒有明顯的理由進行如此多的分配,除非sizeof(Cell) * size * size大到足以使單個分配失敗(但分配較小的部分不會)。我建議只進行一次分配,這會帶來一些好處。沒有特別的順序:
- 在大多數情況下更快的分配。
- 更快地訪問將被緊密打包的元素,因此對快取更友好。
- 更容易的記憶體管理 - 只有一個指標可以檢查和
free. - 與為大量指標分配記憶體時相比,分配的總記憶體更少。
// one allocation:
Cell (*cells)[size][size] = malloc( sizeof *cells );
if(cells == NULL) exit(1); // check for allocation failure
for(int i = 0; i < size; i ){
for(int j = 0; j < size; j ){
(*cells)[i][j].p.y = i;
(*cells)[i][j].p.x = j;
(*cells)[i][j].value = 0;
}
}
// ...
free(cells); // one deallocation
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/414923.html
標籤:
