2017-01-22 5 views
1

の違い、これはg++(バージョン5.4)を使用してコンパイルし、出力を実行すると私のプログラムSegementationの故障箇所があるためprintfの以下

#include <iostream> 
#include <stdio.h> 
#include <stdlib.h> 

using namespace std; 

int main() { 
    int i; 
    int* mix_buffer = &i; 
    int k = 0; 

    while(1) { 

    mix_buffer[k]=1; 
    printf("\n k = %d", k); // 1st printf 
    printf("\n mix_buffer[%d] = %d k = %d", k, mix_buffer[k], k); //2nd printf 
    k++; 
} 

} 

ある

k = 0 
mix_buffer[0] = 1 k = 0 
Segmentation fault (core dumped) 

すなわちセグメンテーション違反は、かつての両方を通過した後に発生していますprintfステートメント私はプログラムの最初のprintf文をコメントし、再コンパイルする場合

ただし、出力は

Segmentation fault (core dumped) 

なぜ以前のセグメンテーションフォールトするプログラム原因

printf("\n k = %d", k); // 1st printf 

のコメントんでしょうか?

+2

あなたのプログラム*未定義の動作*を呼び出します。それを理解しようとするのを止め、代わりにそれを固定することに集中することができます。 'mix_buffer [k]'が0より大きい 'k'の場合は、あなたを崖から送ります。あなたの*コンパイルされたコードと*あなたの*実行環境での*実装で何が起こっているのか本当に見たい場合、アセンブリレベルのデバッガは常に素晴らしいツールです。 – WhozCraig

+0

なぜ 'printf'をC++コードで使用していますか?また '' std;を使うのは悪いです - [こちら](http://stackoverflow.com/questions/1452721/why-is-using-namespace-std-considered-bad-practice) –

+0

@EdHealおかげさまで提案してください。 std :: coutを使用すると同じ動作になります。 – user13107

答えて

1
mix_buffer[k]=1 

あなたは配列に書き込んでいますが、割り当てられていません。 これは、あなたが行うことができ、それを割り当てるにとSegfault

をトリガー:

int mix_buffer[100];//alocates it, with index 0..99 
+0

私は 'int * mix_buffer =&i'を実行するときに割り当てたと思っていました。 – user13107

1
int i; 
int* mix_buffer = &i; 

私はあなたが最初に誤解を招くおそれがあり、あなたの変数mix_bufferの名前を修正するべきだと思います。これは単なるintへのポインターであり、ポインター自体はバッファーではありません。バッファーを指し示す必要があり、そのバッファーを最初に割り当てる必要があります。

この場合、配列インデックスを割り当てずに実際のバッファとしてmix_bufferにアクセスするだけで、コメント内に指摘されているように、UB(segfault)です。 k1より大きいか等しい場合はいつでも、あなたのプログラムは未定義です。

まず、intバッファを適切に割り当ててください。このよう

while(1) 
{ 
    ... 
    if(k++ >= 100) 
    { 
     break; 
    } 
} 
として

int buffer[100] = {0}; 

ような何かそれはwhile(1)ループを使用するために[OK]をですが、あなたはアウトオブバウンドアクセスのために気を付けるとk値をチェックすることで応じて終了させる必要があり、

+0

問題を解決するための提案をありがとう。元のプログラムで問題が発生している理由を理解したい。 'mix_buffer'を使って' i'を指すと、すでに 'i'のアドレスを持っています。ですから、 'mix_buffer [1] = 1'を実行すると、次のアドレスに1を書き込む必要があります。 segfaultは、mix_buffer [1]アドレスがアクセス可能なメモリの外側にある場合にのみ発生します。 mix_buffer [$ randomInteger] – user13107

+0

ではなく、常にmix_buffer [1]でsegfaultを与えて、mix_buffer [$ randomInteger]ではないのはなぜですか? - これらのmix_buffer [k> =] 1]はUBである。 UBのときは、何か具体的なことは言えません。しかし、もう少し 'mix_buffer [$ randomInteger]'を試して、あなたの結論が間違っていることを証明する方法を見てみることができます – artm

関連する問題