2016-03-20 40 views
2

我正在C++中處理二維數組。我無法連接數組和指針的概念。我知道它們在內存分配和訪問元素方面是相關的。例如C++ - 用指針表示法初始化二維數組

int *arr; 
int num = arr + 1*sizeof(int); 

相同

int arr[]; 
int num = arr[1]; 

我試圖找到二維數組和指針 之間相同的連接下面是我的代碼

void printGrid(int **arr) { 
for (int i = 0; i < 10; i++) { 
    for (int j = 0; j < 10; j++) { 
    cout << setw(3); 
    cout << arr[i][j] << " "; 
    } 
    cout << endl; 
} 
} 

int main() { 
int **grid; 
srand(time(NULL)); 
for (int i = 0; i < 10; i++) { 
    for (int j = 0; j < 10; j++) { 
    grid[i][j] = rand() % 11; 
    } 
} 
printGrid(grid); 
} 

當我編譯此,它編譯。當我嘗試運行它時,會出現段錯誤。有人可以指出我的代碼中的錯誤嗎?

由於SO

+2

「int num = arr + 1 * sizeof(int);」與arr [1]不同。 –

+2

沒有分配給**網格的內存。它只是一個指針。爲其分配空間或將其設置爲某種大小,例如malloc或聲明int網格[10] [10]; – user5976242

+1

代碼中沒有2D數組。你有一個指針指針,這是一個完全不同的東西。 – juanchopanza

回答

3
int **grid; 
srand(time(NULL)); 
for (int i = 0; i < 10; i++) { 
    for (int j = 0; j < 10; j++) { 
    grid[i][j] = rand() % 11; 
    } 
} 

在哪裏是應該爲動態數組分配存儲器的一部分?而且可能也是爲了它的元素?爲了解決這個問題,你可以做

// Allocating memory for array and elements 
int **grid = new int*[10]; 
for (int i = 0; i < 10; i++) { 
    grid[i] = new int[10]; 
} 
// Now fill the array as you had in your code 
// 
... 
// Deletion part 
for (int i = 0; i < 10; i++) { 
    delete[] grid[i]; 
} 
delete[] grid; 

此外,

我正在二維數組在C++。我無法連接數組和指針的 概念。我知道它們在內存分配和訪問元素方面與 有關。例如

int * arr; int num = arr + 1 * sizeof(int);

相同

int arr []; int num = arr [1];

不,他們是不一樣的。這將是相同的:

int x[] = {0, 2, 3}; 
int *arr = x; 
int num = *(arr + 1); //Look up pointer arithmetic; same as num=arr[1]; 
+0

好的。我懂了。我如何爲2D陣列分配內存? –

+0

@Q_A查看更新 –

1

grid是一個未初始化的指針。嘗試通過該指針存儲任何內容將導致未定義的行爲,如分段失敗。

您的代碼需要看起來像:

grid = new (int*) [10]; 
for (int i = 0; i < 10; i++) { 
    grid[i] = new int[10]; 
    for (int j = 0; j < 10; j++) { 
     grid[i][j] = rand() % 11; 
    } 
} 

(當你完成你應該delete你分配的內存)

for (int i = 0; i < 10; i++) { 
    delete[] grid[i]; 
} 
delete[] grid; 
+0

謝謝。只是一個後續問題,如果你不介意,我該如何刪除這個2D動態分配的數組。我知道對於非數組變量,我必須寫入delete var;對於數組,我必須寫入delete [] arr;對2D數組如何做?謝謝 –

+0

@Q_A更新刪除代碼。 – AJNeufeld

1

int ** ptrptrint arr[X][Y]之間的一個很大的區別是,ptrptr是一個指向指針的指針,因此它可以保存指針的可變長度爲int,每個指針可以表示不同大小的數組l IKE:

ptrptr (ptrptr points to the beginning of three different sized arrays) ▼ address_1: 0 1 2 3 address_2: 4 5 address_3: 6 7 8

對於arr變量,陣列occuppies連續存儲器,因此它可以被可視化爲矩形,因此認爲它像的每一行必須具有相同數目的元素。