1

変数がメモリ内で相互に上書きするという問題があったため、配列の 1 つを動的に割り当てることにしました。

以下の単純化されたコードでは、動的割り当てを使用して整数の配列を作成し、その整数の配列内の値を関数で編集しようとしています。関数の実行が終了したら、適切に処理された配列を他の関数で使用できるようにしたいと考えています。

私が知っていることから、配列を関数に渡すことはできないため、配列へのポインターを関数に渡すだけです。

#include <iostream>
using namespace std;

void func(int *[]);


int main(){


    //dynamically allocate an array
    int *anArray[100];
    anArray[100] = new int [100];


    func(anArray);

    int i;
    for (i=0; i < 99; i++)
        cout << "element " << i << " is: " << anArray[i] << endl;

delete [] anArray;
}

void func(int *array[]){
    //fill with 0-99
    int i;
    for (i=0; i < 99; i++){
        (*array)[i] = i;
        cout << "element " << i << " is: " << array[i] << endl;
}
}

上記のコードをコンパイルしようとすると、g++ から次の警告が表示されます。

dynamicArray.cc: In function ‘int main()’:
dynamicArray.cc:21:12: warning: deleting array ‘int* anArray [100]’ [enabled by default]

とにかくコンパイルされた a.out 実行可能ファイルを実行すると、何も出力されず、メッセージだけが残ります

Segmentation fault (core dumped)

ターミナルで。

私は何を間違っていますか?私のコードは、私が作成した配列の外部にアクセスまたは書き込みを試みていません。実際、配列の最後の要素の読み取りまたは書き込みを試みているわけではありません。

実際に配列を変更する部分をコメントアウトすると、本当に奇妙なことが起こります。

//(*array)[i] = i;

G++ は同じ警告でコンパイルされますが、a.out を実行すると、代わりに次のようになります。

element 0 is: 0x600df0
element 1 is: 0x400a3d
element 2 is: 0x7f5b00000001
element 3 is: 0x10000ffff
element 4 is: 0x7fffa591e320
element 5 is: 0x400a52
element 6 is: 0x1
element 7 is: 0x400abd
element 8 is: 0x7fffa591e448
element 0 is: 0x600df0
element 1 is: 0x400a3d
element 2 is: 0x7f5b00000001
element 3 is: 0x10000ffff
element 4 is: 0x7fffa591e320
element 5 is: 0x400a52
element 6 is: 0x1
element 7 is: 0x400abd
element 8 is: 0x7fffa591e448
*** glibc detected *** ./a.out: munmap_chunk(): invalid pointer: 0x00007fffa591e2f0 ***
======= Backtrace: =========
/lib/x86_64-linux-gnu/libc.so.6(+0x7eb96)[0x7f5b92ff4b96]
./a.out[0x400976]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xed)[0x7f5b92f9776d]
./a.out[0x400829]
======= Memory map: ========
00400000-00401000 r-xp 00000000 00:13 4070334                                /home/solderblob/Documents/2013 Spring Semester/CSC 1254s2 C++ II/Assignment 1/a.out
00600000-00601000 r--p 00000000 00:13 4070334                                /home/solderblob/Documents/2013 Spring Semester/CSC 1254s2 C++ II/Assignment 1/a.out
00601000-00602000 rw-p 00001000 00:13 4070334                                /home/solderblob/Documents/2013 Spring Semester/CSC 1254s2 C++ II/Assignment 1/a.out
01eb5000-01ed6000 rw-p 00000000 00:00 0                                  [heap]
7f5b92a64000-7f5b92a79000 r-xp 00000000 08:16 11276088                   /lib/x86_64-    linux-gnu/libgcc_s.so.1
7f5b92a79000-7f5b92c78000 ---p 00015000 08:16 11276088                   /lib/x86_64-    linux-gnu/libgcc_s.so.1
7f5b92c78000-7f5b92c79000 r--p 00014000 08:16 11276088                   /lib/x86_64-    linux-gnu/libgcc_s.so.1
7f5b92c79000-7f5b92c7a000 rw-p 00015000 08:16 11276088                   /lib/x86_64-linux-gnu/libgcc_s.so.1
7f5b92c7a000-7f5b92d75000 r-xp 00000000 08:16 11276283                   /lib/x86_64-linux-gnu/libm-2.15.so
7f5b92d75000-7f5b92f74000 ---p 000fb000 08:16 11276283                   /lib/x86_64-linux-gnu/libm-2.15.so
7f5b92f74000-7f5b92f75000 r--p 000fa000 08:16 11276283                   /lib/x86_64-linux-gnu/libm-2.15.so
7f5b92f75000-7f5b92f76000 rw-p 000fb000 08:16 11276283                   /lib/x86_64-linux-gnu/libm-2.15.so
7f5b92f76000-7f5b9312b000 r-xp 00000000 08:16 11276275                   /lib/x86_64-linux-gnu/libc-2.15.so
7f5b9312b000-7f5b9332a000 ---p 001b5000 08:16 11276275                   /lib/x86_64-linux-gnu/libc-2.15.so
7f5b9332a000-7f5b9332e000 r--p 001b4000 08:16 11276275                   /lib/x86_64-linux-gnu/libc-2.15.so
7f5b9332e000-7f5b93330000 rw-p 001b8000 08:16 11276275                   /lib/x86_64-linux-gnu/libc-2.15.so
7f5b93330000-7f5b93335000 rw-p 00000000 00:00 0 
7f5b93335000-7f5b93417000 r-xp 00000000 08:16 31987823                       /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.16
7f5b93417000-7f5b93616000 ---p 000e2000 08:16 31987823                       /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.16
7f5b93616000-7f5b9361e000 r--p 000e1000 08:16 31987823                   /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.16
7f5b9361e000-7f5b93620000 rw-p 000e9000 08:16 31987823                     /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.16
7f5b93620000-7f5b93635000 rw-p 00000000 00:00 0 
7f5b93635000-7f5b93657000 r-xp 00000000 08:16 11276289                   /lib/x86_64-linux-gnu/ld-2.15.so
7f5b93834000-7f5b93839000 rw-p 00000000 00:00 0 
7f5b93853000-7f5b93857000 rw-p 00000000 00:00 0 
7f5b93857000-7f5b93858000 r--p 00022000 08:16 11276289                   /lib/x86_64-linux-gnu/ld-2.15.so
7f5b93858000-7f5b9385a000 rw-p 00023000 08:16 11276289                   /lib/x86_64-linux-gnu/ld-2.15.so
7fffa5900000-7fffa5921000 rw-p 00000000 00:00 0                          [stack]
7fffa59ff000-7fffa5a00000 r-xp 00000000 00:00 0                          [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0                  [vsyscall]
Aborted (core dumped)
4

4 に答える 4

5

書くとき:

int *anArray[100];
anArray[100] = new int [100];

最初の行では、int への 100 個のポインターの配列を割り当てています。2 行目では、int の配列を動的に割り当て、その配列のアドレスをポインターの配列の 100 セルに割り当てます。適切な構文は次のとおりです。

int *anArray;
anArray = new int [100];
于 2013-01-22T06:17:11.773 に答える
1

配列のインデックス付けは。から始まり0ます。
lenの配列には、からまでの100インデックスがあります。099

したがって、セグメンテーション違反anArray[100]が発生します。

あなたはこれをしたいかもしれません:
anArray[99] = new int[100];

または、ポインタの配列をintに動的に割り当てたい場合は、次のようにします。
int **anArray = new int*[100];

于 2013-01-22T06:23:20.920 に答える
0
//dynamically allocate an array
int *anArray[100];
anArray[100] = new int [100];

anArrayint への 100 個のポインターの配列です。101 番目の要素 (バッファ オーバーフロー!) には、動的に割り当てられた 100 int の配列の最初の要素を指すポインタを割り当てます。それを修正して、2 つの行を としてマージしint* anArray = new int[100];ます。

于 2013-01-22T06:18:35.363 に答える
0
int *anArray[100];
anArray[100] = new int [100];

最初に、100 個のポインターの配列を割り当てています。次に、範囲外アクセスを実行しています。の最後の要素はanArrayですが、存在しないanArray[99]メモリを割り当てています。anArray[100]これにより、セグメンテーション違反が発生します。

最後に、タイプの静的配列を削除していますint*anArrayコンパイル時に割り当てられ、タイプ の 100 個のポインターが含まれますintdelete[]ステートメントを削除します。

于 2013-01-22T06:17:44.533 に答える