2016-03-20 14 views
2

私はC++で2D配列を扱っています。私は配列とポインタの概念を結びつけるのに問題があります。私はそれらがメモリ割り当てと要素へのアクセスという点で関連していることを知っています。例えばC++ - ポインタ表記で2D配列を初期化する

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

は、私は、私はこれをコンパイルすると、2次元配列とポインタ 間の同じ接続がここに私のコード

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); 
} 

だ見つけようとしている

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

と同じですそれはコンパイルする。私はそれを実行しようとすると、私はsegfaultを取得します。誰かが私のコードのエラーを指摘してくれますか?

おかげ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++での2次元配列に取り組んでいます。私は配列とポインタの概念を に接続するのに問題があります。私はそれらがメモリ割り当てと要素にアクセスするという意味で関連していることを知っています。例えば、

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

は、

と同じです。 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]の間の1つの大きな違いは、そのptrptrですintポインタへのポインタなので、可変長のintポインタを保持できます。ポインタのそれぞれは、サイズの異なる配列を表すことができます。l IKE:arr変数について

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

、アレイは、連続したメモリをoccuppies、ひいてはそれが長方形として視覚化することができるので、各列が同じ数の要素を有していなければならないようにそれを考えます。