nul 終端文字に十分なメモリと 1 を割り当てることを覚えておくことが重要です (賢明な読者はこの nul を指摘するでしょう。これには主に理由があります - 'l' が 1 つある nul は'\0'
[Software Monkey さん、指摘してくれてありがとう。エラー!]、2 つの 'l' を持つ null は何も指していないポインターです)。
セグフォルトがどのように発生するかの例を次に示します
int main(int argc, char **argv){
int *x = NULL;
*x = 5;
//ブーム
}
x はポインターであり、null に設定されているため、ポインターを逆参照して値を代入しようとします。セグメンテーション違反を生成する保証された方法。
シグナルハンドラをセットアップして SIGSEGV をトラップし、シグナルハンドラ内で次のようなプロセスを呼び出すことにより、実際にセグフォルトをトラップしてスタックトレースを取得できるという古いトリックが利用できます。これは UNIX 環境でより一般的です。
char buf[250];
buf[0] = '\0';
sprintf(buf, "gdb -a %d | where > mysegfault.txt", getpid());
システム(buf);
これにより、現在実行中の C プログラムがアタッチされ、デバッガーにシェルが実行され、デバッガーにアタッチされます。そのwhere
一部には、セグ フォールトの原因となった問題のある行のスタック トレースが表示され、出力が現在のディレクトリ内のファイルにリダイレクトされます。
注: これは、インストールに応じて定義された実装です。AIX では、gnu デバッガーが存在するため、これは機能します。マイレージは異なる場合があります。
これがお役に立てば幸いです。よろしくお願いします、トム。