セグメンテーション違反は、何かが間違っていることを意味します。しかし、セグメンテーション違反がないということは、何かが間違っていないという意味ではありません。2つの状況が基本的に同じで、一方のセグメンテーション違反ともう一方の状況が同じでない場合、通常は両方が間違っていることを意味しますが、たまたまどちらか一方だけがセグメンテーション違反をトリガーしています。
行を見ると、char* incall[10]
それは、charへの10個のポインターの配列があることを意味します。デフォルトでは、これらのポインタはランダムな場所を指しています。したがって、incall [0]に入ると、文字列がランダムな場所にコピーされます。これはおそらくセグメンテーション違反になりそうです!最初にincall[0]を初期化する必要があります(を使用してmalloc
)。
それで、より大きな問題は、なぜ最初の行がセグメンテーション違反にならないのかということです。その理由は、以前にメモリにあったものがすべて有効なポインタであったためだと思います。したがって、strcpyはセグメンテーション違反ではなく、後で完全に予期しない動作を引き起こす他の何かを上書きするだけです。したがって、両方のコード行を修正する必要があります。
もう1つの問題(一度修正すると)は、strcpy
それ自体が非常に危険であるということです。0バイトが見つかるまで文字列をコピーして停止するため、コピーする量を正確に確認することはできません(strlen
割り当てに使用しない限り)。宛先メモリ)。したがってstrncpy
、代わりにを使用して、コピーされるバイト数をバッファのサイズに制限する必要があります。