2017-07-02 10 views
-1

ここに誰かが||オペレータに関する質問をしました。彼はなぜ(j=3) || (i=3)が3をiに割り当てていないのかと疑問に思った。はい、私はそれがstderrに出力する必要があります知っているこのコードはメモリリークを引き起こしますか?

ptr = malloc(sizeof(*ptr)) || printf("Error\n"); 

、しかし:私は、この「機能」を使用することができる方法のために、この例を与えたDetermining the print of Cその質問への私の最初の答えで

:その記事はこちらそれは話題ではない。私が正しく覚えていれば、この構造がメモリリークを引き起こす可能性があると言われました。私は信じ難いと思うので、私に説明してください。

この構成を使用しない特別な理由はありますか?明白な「私ができるから」とは別に、それが与える印象は?

+7

ジレットタグのコードなので使用しないでください。 –

答えて

4

mallocが失敗した場合、それはわかりません。代わりに、返された値printf(印刷された文字数)をメモリアドレスとして扱い、未定義の動作につながります。

これはメモリリークより悪いです。常にmallocの結果にptrを割り当てることによって、この問題を修正する割り当ての周りに括弧を置く

:しかし

(ptr = malloc(sizeof(*ptr))) || printf("Error\n"); 

は、あなたはまだ割り当てが失敗した場合、ポインタを使用しないように確認する必要がありますので、多くのコードを保存することはありません。

+0

ああ、今私はそれを手に入れます。それで、左のオペランドの周りに余分な括弧を入れたのはなぜですか? – klutt

+0

はい。課題の周りにカッコを入れるとこの問題が解決されます。 – SLaks

関連する問題