0

以下は関数の一部です。

l->length[l->cl] = atoi(p->wds[p->cw]);
printf("FD %d\n", l->length[l->cl]);
p->cw = p->cw + 1;
l->cl = l->cl + 1; 
printf("prevent from seg fault\n");
instr(p);

削除するprintf("prevent from seg fault\n");とセグメンテーション違反が発生しますが、そのままにしておくと実行され、ネスト関数などに移動します。

したがって、私の質問は、一般的になぜこれが起こるのかということです。セグメンテーションが発生する理由を理解できるように、十分なコードを表示していないことはわかっていますが、これについて一般的な説明がある場合は、私の別の場所にもこれがありましたプログラムですが、最後に削除できますか?

よろしく オリー

4

1 に答える 1

6

標準に関する限り、未定義の動作を呼び出すプログラムに加えられた変更は、何らかの結果をもたらす可能性があります。その背後にロジックがある必要はありません。実際、未定義の動作に遭遇したときに特定の実装がどのように動作するかを推論しようとすることは、ほとんど実りがありません。

つまり、printf(または他の関数)への呼び出しがプログラムの動作を変更する場合(もちろん、想定されているものを印刷するという明らかな変更を超えて)、考えられる説明の1つは、ローカルを指す無効なポインターがどこかにあることです。範囲外の変数。printfその変数が、独自のローカル変数用に現在使用されているスタック メモリに以前存在していた場合、ポインタが指すメモリが新しい値で上書きされることを意味します。そしてもちろん、ポインターを使用するコードの動作を変更できます。

于 2013-01-05T11:59:30.593 に答える