2016-04-01 8 views
0

私のプログラムがなぜセグメンテーション違反であるのかわかりにくいです。どんな助け? いくつかのコンテキスト:これは、さまざまな入力で実行され、関数が正しいかどうかを判断するプログラムを通じて、このメソッドを実行するコード割り当てです。この割り当ての目的は、アセンブリを読み取り、指定されたアセンブリに基づいて関数を構築することです。私のプログラムはなぜsegfaultですか?

私はcomp4メソッドとは思えません。なぜなら、私はそれを指定されたアセンブリと比較しており、それはproblem4メソッドにあることを示唆していますが、問題4に何があるかはわかりませんseg fault。誰も助けてくれますか?

long int comp4(long int * a, long int b) { 
    long int output = *a; 
    long int newa = output + b; 
    *a = newa; 
    return output; 
} 

long int problem4(long int a, long int b){ 
int i; 
long int* ap; 
*ap = a; 
long int sum; 
long int holder; 
for (i=0;i<b;i++){ 
    sum = sum + i*8; 
    holder = comp4(ap,2); 
    sum = sum + holder; 
} 
return sum; 
} 
+1

デバッガで実行します。 segfaultを生成するのはどの行ですか? –

+3

'long int * ap;' ...... * ap = a;初期化されていないポインタUB。 –

+4

ここで、 '* ap = a'は初期化されていないポインタを間接参照します。あなたは 'ap =&a'を意味しましたか?それは 'a'を' p'にします。 –

答えて

0

apは、初期化されていないポインタです。 long int *apを宣言すると、long int *のアドレスを保持できるスタック上のメモリが割り当てられますが、このポインタが指す変数のメモリは割り当てられません。

したがって、*演算子を使用して逆参照できるようにするには、ポインタ値を初期化する必要があります。

より適切なアプローチは、未初期化ポインタを間接参照

long int *ap = &a;

または

long int *ap = malloc(sizeof(long int)); 
*ap = a; 

は、あなたのプログラムのセグメンテーション違反の理由です::だろう!

+0

2番目のコードサンプルはどの言語で書かれていますか?少なくともプリプロセッサの魔法を振りかざしていなくても、Cではありません。 –

+0

@JohnBollingerが更新されました! :) – user007

+0

ありがとう!私は、これらのsegfaultの質問は繰り返し得ることを認識しますが、とにかく答えることを感謝します。 – wtk219

関連する問題