0

これは、問題を説明するための単純化されたコードです。

int *nums[10];

*nums[0] = 5;

cout << *nums[0] << endl;

コードはコンパイルされましたが、実行時に失敗します。だから私はこれを試しました:

int *nums[10];

*nums[1] = 5;

cout << *nums[1] << endl;

そしてそれはうまく印刷されます。配列が、通常の *nums[0] から *nums[10] ではなく、*nums[1] から *nums[10] に始まっていることがわかりました。Netbeans C/C++ コンパイラを使用している他の人に確認したところ、彼らのコンパイラは正常に動作します。特定のコンパイラ内で変更された設定があると思います。本来の方法で動作するように変更するにはどうすればよいですか?

4

2 に答える 2

2

配列0 ベースです。未定義の動作が発生しています。

int *nums[10];

への 10 個の初期化されていないポインタの配列を作成しますint

*nums[0] = 5;

初期化されていないポインターを逆参照します。何でも起れる。期待どおりに動作させるには、ポインタにアクセスする前にメモリを割り当てます。

for ( int i = 0 ; i < 10 ; i++ )
   nums[i] = new int;

最後に削除します:

for ( int i = 0 ; i < 10 ; i++ )
   delete nums[i];

たとえば、MSVS で次のような警告が表示されます。

警告 C4700: 初期化されていないローカル変数 'nums' が使用されました

また、クラッシュ:)。

于 2012-05-31T21:13:01.970 に答える
-2

C/C++ では、配列のインデックスは常に 0 です。

整数の配列を作成したいと仮定しています。整数へのポインタの配列を作成したい場合は、ルシアンの答えをチェックしてください。

整数値への 10 個のポインターの配列を宣言しました。実際の値にメモリを割り当てていません。そのため、エラーが発生します。

整数にメモリを割り当てる必要があります。これには、次の 2 つの方法があります。

int nums[10];
nums[0] = 5;
cout << nums[0] << endl;

また

int* nums = new int[10];
nums[0] = 5;
cout << nums[0] << endl;
delete[] nums; // don't forget to delete
于 2012-05-31T21:13:58.377 に答える