2011-08-16 3 views
5

私は取得しています問題を使用して、それを解放した後、ポインタを使用して:私は、セグメンテーションフォールトを取得しています次のコードタイプと自由()

int* myPointer1 = malloc(50 * sizeof(int)); 
int* myPointer2 = malloc(50 * sizeof(int)); 
free(myPointer1); 
myPointer1 = myPointer2; 
myPointer1[0] = 3; 

。どうしたの?

+5

malloc操作が成功したことを確認しましたか? myPointer1をNULLに割り当てていない場合があります。 – djhaskin987

+0

あなたはどこでセグメンテーションをしますか? 'free(myPointer1)'または 'myPointer1 [0] = 3'で? – Seth

+0

'malloc'が成功した場合、segfaultは存在しません。あなたがやっていることは、 'myPointer1'の元のメモリ位置でメモリを解放し、' myPointer1'を 'myPointer2'の位置に再割り当てすることだけです。ただし、メモリの最後のビットを解放する場合は、ポインタが同じアドレスを指しているので、ポインタの1つ(つまり、 'myPointer1'または' myPointer2')を解放したいだけです。 – RageD

答えて

3

このコードでは問題はありません。あなたが投稿したスニペットは正しいと思われ、孤立してうまく動作します。

+0

コードスニペットは正しいため正しくありません。正しく動作しているため正しくありません。UBであってもうまく動作し、予想以上に時間が掛かります。 –

+2

"コードスニペットが正しいため正しいです" - > http://xkcd.com/703/ =) – jadarnel27

+2

正しいとは言えませんでしたが、正しく機能していると言いました。それは明らかに未定義の振る舞いを含んでいません)、*と*は動作します(例えば、私はセグメント化の失敗を報告しません)。 – duskwuff

2

あなたのコードは間違っていませんが、malloc()関数の戻り値をテストする習慣を作っています。もしNULLであればプログラムで問題が発生します。 malloc()関数が失敗しました

関連する問題