2016-12-03 7 views
-4

私はmpz変数を宣言し、それらをvoid関数で初期化します。Cでのセグメンテーションフォールト(GMP lib付き)

これは機能しません。例えば

mpz_t a; 
init(); 
    ... 
void init(){ 
    mpz_init(a); 
    .... 
} 

エラーなし。

init(); 
    ... 
    void init(){ 
     mpz_t a; 
     mpz_init(a); 
    } 

エラーが発生します。

+3

[最小限で完全であり、検証可能な例](http://stackoverflow.com/help/mcve)の作成を試みてください。そして、デバッガで動作させて、動作中のクラッシュをキャッチし、コード内でどこで発生しているのかを確認しましたか? –

+2

「エラーが発生しました」というメッセージが表示された場合、エラーメッセージの内容を正確に把握することが重要です。 – Chris

答えて

0

あなたが持っている少しのコードから、違いは変数aの範囲と思われます。 mpz_init(a)をローカルスコープの変数(init()関数内)に呼び出す点は何ですか? init()が返された後には、aが表示されなくなります。後で何かを必要とする場合は、変数aとおそらくmpz_init()の副作用の一部が存在しません。 mpz_init()の副作用がinit()の末尾を超えて保持されるようにするには、init()の末尾を過ぎても持続するいくつかの構造に影響を与える必要があります。あなたの最初の例では、aはグローバルスコープで宣言されているので、プログラム全体に対して存続します。

関連する問題