2013-04-25 7 views
10

同じCファイル内の異なる機能で同じgotoラベルを使用することが許されるのか誰かに教えてもらえますか?私が直面していますかを説明するにはCファイルでも同じ機能を持つラベルを使用する

function1() 
{ 
    ... 

    goto label 

    ... 

label: 
    ... 
} 

function2() 
{ 
    ... 

    goto label; 

    ... 

label: 
    ... 
} 

を今起こっていただきましたが、ラベルの後にコードがmallocさのデータのクリーンアップのために使用されていることです。そして、すべてが機能2でクラッシュしています。私はmemを印刷した。空いていて同じ場所が複数回解放されています。これはすべての功績のためですか?これはgotoステートメントの有効な使用ですか?

+1

質問の書式を正しく設定してください。 – Alex

+0

実際の問題を解決するためのコードを投稿しようとしています... – akp

+0

異なる機能で同じラベル名を使用できますが、別の機能にある*ラベルは使用できません。あなたのクラッシュはラベル名が再使用されることに関連していません。あなたのコードに何か間違っていて、ダブルフリーを引き起こします。 –

答えて

15

ラベルはローカルなので、複数の機能で同じラベルを使用できます。

gotoを使用すべきかどうかは、別の問題ですが、簡単には答えられないものです。つまり、gotoは使用しないでください。しかし、すべてのものと同様に(特にプログラミングに関しては)、gotoが役に立つかもしれない例外があります。

+8

そして、クリーンアップのためのgotoの使用はそれらの1つである傾向があります。 – Medinoc

+1

ビルドアップ/ティアダウンが複雑で(例:Linuxカーネル)、さまざまな終了条件がコードを他のものから再利用する場合(例:リソースの割り当て/解放)にgotoが頻繁に使用されます。これらの場合、gotoを使用するときれいになり、フォールスルー・メカニズムが分解のさまざまな段階で正確に同じシーケンスを強制することが保証されます。 –

5

Joachimがここに述べたように、ラベルはローカルです。ラベルは現在のブロックではなく、関数のローカルであることに注意してください。 gotoステートメントは、全機能スコープを除いてスコープを尊重しません。

関連する問題