0

これが私が使っていたコードスニペットです:

int *a;
int  p = 10;

*(a+0) = 10;
*(a+1) = 11;
printf("%d\n", a[0]);
printf("%d\n", a[1]);

今、私はそれが印刷されることを期待しています

10
11

ただし、program.exeが動作を停止したことを示すウィンドウが表示されます。コードの2行目をコメントアウトしてからint p = 10;、コードを再度調整すると、機能します。

なぜこうなった?(私がやりたかったのは、動的サイズの配列を作成することでした。)

4

6 に答える 6

9

これにはおそらく少なくとも50の重複がありますが、それらを見つけることは簡単ではないかもしれません。

とにかく、あなたはポインタを定義していますが、それが指すためのメモリがありませ。起動時にポインタに含まれているランダムなアドレスに書き込みを行っているため、未定義の動作が発生します。

また、構文が正しくないため、コードはコンパイルされませんint *a, int p = 10;。コンマはセミコロンにする必要があります(または、2番目のコンマを削除することもできますが、int実際にはお勧めしません)。

Cでは、スペースを動的に割り当てる必要がない限り、おそらくポインターの代わりに配列を使用する必要があります(おっと、再読み込み、明らかにしたいのでmalloc、スペースの割り当てに使用する必要a = malloc(2);があります。また、使用する前に戻り値を確認する必要があります。少なくとも理論的にmallocは、nullポインターを返すことができます)。C ++では、std::vector配列やポインターの代わりに使用することをお勧めします(動的割り当てを管理します)。

于 2012-06-11T15:35:35.563 に答える
3

メモリは割り当てられていません。これはintへaの初期化されていないポインタです(したがって、2つの問題があります)。

したがって、データがその場所に保存されている場合、動作は未定義です。つまり、セグメンテーション違反やプログラムのクラッシュが発生しない場合や、->未定義の場合があります。(Cは境界チェックを行わないため、この種の問題を警告することはありません。残念ながら、Cの長所の1つは、その主要な短所の1つでもあり、要求どおりに機能します)

于 2012-06-11T15:34:03.503 に答える
2

あなたはメモリを割り当てていないので、無効なメモリにアクセスしています...

mallocを使用して、アレイに十分なメモリを割り当てます。

int* a = (int*) malloc(sizeof(int)*arraySize);
//Now you can change the contents of the array
于 2012-06-11T15:35:06.997 に答える
1

その配列のメモリを割り当てるには、mallocを使用する必要があります。

サイズを動的にする場合は、すでに存在するデータを破棄せずに配列のサイズを増やすたびに、reallocを使用する必要があります。

于 2012-06-11T15:50:28.407 に答える
0

アレイにストレージを割り当てる必要があります。mallocCを使用newしている場合、C ++のstd::vector<int>場合、または配列サイズを動的にする必要がある場合はC++を使用します。

于 2012-06-11T15:34:16.640 に答える
0

まず、aが初期化されていません。それは何を指しているのですか?何も、うまくいけばゼロですが、あなたは知りません。

次に、それに1を追加し、そのバイトにアクセスします。aが0の場合、a+1は1になります。メモリロケーション1には何がありますか。

また、アドレス可能なメモリユニットを1つ増やしています。これは、そのマシンの整数のサイズである場合とそうでない場合があります。

于 2012-06-11T15:38:05.343 に答える