2012-07-02 23 views
13

可能な重複に値を代入することはできません。
Segmentation Fault when attempting to print value in Cは変数とポインタ

私はCに非常に新しいんだけど、何のアイデア、なぜこのプログラムブレークを持っていません。 iと関係のある行を削除するとプログラムがコンパイルされて実行されますが、iを割り当てた場合、プログラムを中断することなく、*ptrに何も割り当てることができなくなります。

int main(void) 
{ 
    int i; 
    int *ptr; 

    i = 2; 
    *ptr = 5; 
    printf("%d",*ptr); 
} 
+2

* PTRへの書き込みしようとする前に、[この](http://stackoverflow.com/questions/11278085/segmentation-fault-when-ライン

ptr = &i; 

を追加することによって、私にPTRポイントを作ってみましょうcで印刷価値を試してみた)ほとんど__identical_質問が昨日尋ねられた。 – pb2q

+0

問題は、ポインタを作成したが、何も指し示さないということです。新しいものを使ってメモリを割り当てたり、iのような変数をポイントしたりすることができます。 – jlunavtgrad

答えて

11

ポインタを初期化されていない値のままにします。したがって、逆参照すると(*ptr)、メモリ内の任意の場所にアクセスし、セグメント化エラーが発生します。 ptr自体(ない*ptr)変数のアドレス(&iなど)または(malloc(sizeof(int))など)いくつかの新たに割り当てられたメモリを割り当てることにより、何かに

ポイントptr。ここで

+0

なぜ、単に私が 'int * ptr;' '* ptr = 5;'を使うとうまくいくのですか? –

+0

プラットフォーム、コンパイラ、設定に応じて、動作するかクラッシュする可能性があります...いずれにせよ、間違っています。 Cは安全でない言語であり、メモリエラーをチェックしません。プログラムに気付かれず、予期しないときにストライキする可能性があります。 :) – Kos

+1

ありがとう!私はマニュアルのメモリ管理言語で作業したことがないので、これは私にとって初めてのことです。確かに考えなければならないことはたくさんあります。 –

-1

Cでのポインタを使用する前に、あなたはメモリの既存のブロックへのポインタを設定するかを必要とする、あなたはこのように、それのためにメモリを割り当てる必要があります。

int *ptr = (int *)malloc(sizeof(int)); 
4

は、Cのための答えです:

また
int main(void) { 
    int i; 
    int * ptr = (int *)malloc(sizeof(int)); 

    i = 2; 
    *ptr = 5;  
    printfn("%d",*ptr); 
    free(ptr); 
} 

あなたは可能性がiと* ptrに割り当てラインのようなものを使用するために:無料で出てきたことも

int main(void) { 
    int i; 
    int * ptr; 

    i = 2; 
    ptr = &i;  
    printfn("%d",*ptr); // should print 2 
} 

お知らせ!

1

あなたはptrを宣言しましたが、何かを指摘しませんでした。次に、それが指しているものに書き込もうとしました。これは決して良い考えではありません。あなたは

関連する問題