2013-07-15 12 views
8

私はちょうどCを学び始めました。そして、私はポインタの働きを理解するためにMinGW for Windowsを使っていくつかの簡単なプログラムを実行してきました。私は、次のことを試してみました:Cのポインタに直接値を代入する

私はそれが動作しない実行可能ファイルを実行すると、正しくコンパイルされますが
#include <stdio.h> 

int main(){ 
    int *ptr; 
    *ptr = 20; 
    printf("%d", *ptr); 
    return 0; 
} 

- 値は、コマンドラインに印刷されません、代わりに私は.exeファイルをというエラーメッセージが表示されます動作を停止しました。

私はint型の変数に値を格納し、以下に示すように、その変数のメモリアドレスに*のPTRを割り当てるしようとしたときしかし:

#include <stdio.h> 

int main(){ 
    int *ptr; 
    int q = 50; 
    ptr = &q; 
    printf("%d", *ptr); 
    return 0; 
} 

それが正常に動作します。

私の質問は、なぜ私は直接ポインタにリテラル値を設定できないのですか?私はポインタのチュートリアルを見てきましたが、そのほとんどは2番目の例と同じようにしています。

何か助けていただければ幸いです。

+0

ポインタが初期化されていないため、どこにでもポインタがあり、プログラムがクラッシュする可能性があります。 – Till

+1

あなたは幸運にも、エラーで終了しました。 – JonnyRo

+1

@JonnyRoが正しいです。実際のコードでは、この種のバグは、1週間に1回のデバッグセッションを引き起こし、何らかの他の変数が何度もランダムに変更される理由を理解しようとします(実際にテストしているとき、パブリックデモンストレーション)やセキュリティ違反があり、別の値を操作して誰かが "is_admin"フラグをtrueに設定すると、 – abarnert

答えて

20

問題は、ポインタを初期化していないことです。 「どこでも好きな場所」へのポインタを作成しました。これは、他の変数のアドレス、コードの途中、またはマップされていないメモリです。

int *変数がポイントするメモリのどこかに変数intを作成する必要があります。

2番目の例はこれを行いますが、ここでは関係のないその他のことも行います。ここであなたがする必要がある最も単純なことだ:

int main(){ 
    int variable; 
    int *ptr = &variable; 
    *ptr = 20; 
    printf("%d", *ptr); 
    return 0; 
} 

はここであなただけ20であったものは何でも価値交換するつもりだので、int変数は、初期化され、それは大丈夫ですされていません。キーはポインタvariableを指すように初期化されていることです。それは、不特定のメモリ位置を指すように、最初の例で

int main(){ 
    void *memory = malloc(sizeof(int)); 
    int *ptr = (int *)memory; 
    *ptr = 20; 
    printf("%d", *ptr); 
    free(memory); 
    return 0; 
} 
1

、PTRが初期化されていない。実際には、あなただけの、あなたがしたい場合を指すようにいくつかの生のメモリを割り当てることができます。この不特定の場所に何かを割り当てると、あなたのプログラムが爆発します。

2番目の例では、ptr = & qと言うときにアドレスが設定されているので、問題ありません。

7

キーは、あなたがそれはあなた自身が管理しているアドレスに割り当てられている知っているまで、あなたはどちらか、ポインタを使用することはできませんでコメント

#include <stdio.h> 

int main(){ 
    int *ptr;    //Create pointer to random memory address 

    int q = 50;   //Create local variable with contents int 50 

    ptr = &q;    //Update address targeted by above created pointer to point 
          // to local variable your program properly created 

    printf("%d", *ptr); //Happily print the contents of said local variable (q) 
    return 0; 
} 

とコメント

#include <stdio.h> 

int main(){ 
    int *ptr;    //Create a pointer that points to random memory address 

    *ptr = 20;   //Dereference that pointer, 
          // and assign a value to random memory address. 
          //Depending on external (not inside your program) state 
          // this will either crash or SILENTLY CORRUPT another 
          // data structure in your program. 

    printf("%d", *ptr); //Print contents of same random memory address 
          // May or may not crash, depending on who owns this address 

    return 0;    
} 

、第2のプログラムとの最初のプログラムあなたが作成した別の変数またはmalloc呼び出しの結果を指すことによって、

ランダムメモリアドレスは、プログラムが既に所有しているメモリ空間内にあるため、クラッシュすることはありますが、最悪の場合には初期化されないメモリに依存するコードを作成する前に使用しています。プログラム内の他の場所で使用しているデータ構造を上書きすると、神はあなたを助けます。

+1

いいえイラスト。 – abarnert