2

私は現在 C を学んでおり、wibit.com から以下をコピーしました。

#include <stdio.h>

int main()
{
    int* n;
    *n = 20;
    printf("%i\n", *n);
    return 0;
}

私はGCCを使用しており、次のようにcmdプロンプトでコンパイルして実行しています:

gcc prgrm.c -o prgrm.exe    #compiles without any errors
prgrm.exe

その後、prgrm.exe が動作を停止したというエラーが表示されます。デバッグをクリックすると、次のようになります。

デバッグ レポート

私のすべてのプログラムは以前に実行されており、別のいくつかでテストしました(単に return 0; または printf(etc...) )、それらは機能します!

何か案は?ありがとう

4

1 に答える 1

7
int* n;

へのポインタを宣言しますint。アドレスが割り当てられていないため、メモリ内の任意のアドレスを指します。このアドレスは、ほぼ確実に書き込み可能ではありません。書き込み可能だったとしても、それはあなたの記憶ではないので、書き込みの影響がどうなるかはわかりません。

*n = 20;

この予測不可能なアドレスに書き込もうとします。これにより、未定義の動作が発生します。クラッシュは、未定義の動作の有効な (そして便利な) タイプです。

プログラムを機能させるには、 にストレージを割り当てる必要がありますn。スタック上でこれを行うことができます

int n;
n = 20;
printf("%i\n", n);

またはヒープ上で動的に

int* n = malloc(sizeof(*n));
if (n == NULL) {
    printf("Error: out of memory\n");
    return -1;
}
*n = 20;
printf("%i\n", *n);
free(n);

ビルドの警告を有効にした場合、コンパイラは初期化されていない変数のこの使用について警告することに注意してください。-Wallこれを有効にするには、gcc または/W4MSVCのコマンド ラインに追加します。

于 2013-07-08T13:07:20.683 に答える