2017-05-20 8 views
0
#include<stdio.h> 
int main(){ 
    int a[12]; 
    for(int i=0;i<12;i++){ 
    a[i]=i*i+1; 
    } 
    int *p=a; 
    for(;p<(p+10);p++){ 
    printf("%d",*p); 
    } 
} 

これはセグメンテーションエラーを返しています。 printfで新しい行を使用すると、迷惑文字が返されてからSegmentationフォールトが返されます。セグメンテーションフォールトを引き起こすCのポインタを配列サイズ内にインクリメントする

で構成:--prefix = /ライブラリ/開発/ CommandLineToolsは/ usr --with-GXX-含ま-dirを=は/ usr /含める/ C++/4.2.1 私はコンパイラのこのバージョンを使用していますアップルLLVMのバージョン8.1.0(打ち鳴らす-802.0.42) ターゲット:x86_64版 - アップルdarwin16.5.0 スレッドモデル:POSIX InstalledDir:/ライブラリ/開発/ CommandLineToolsは/ usr/binに

答えて

3

p < (p + 10);は動作しません。永久にループするので、いつもpをインクリメントします。毎回pがインクリメントするので、式が増えます。それはその尾を引っ掛けようとする子猫のようなものです。

最終的にはpがプログラムの外部にあるメモリを指し始めますが、これはアクセス違法なので、クラッシュします。

printfで新しい行を使用すると、ジャンク文字が返され、セグメンテーションフォールトが間違っているというあなたの観察によると、それはあなたが期待した正確な値を含む12行を返してから、次にガーベジとして、そしてセグメンテーションの失敗が起こります。

改行なしでは、プログラムの出力は、改行が発行されるか、プログラムが終了するのを待つ内部バッファにキャッシュされていますが、改行が発行される前にクラッシュが発生するため、任意の出力を参照してください。

+0

ありがとうマイク!私はちょうどC、愚かな間違いで始まった:(。 –

関連する問題