gccコンパイルsegmentation faultのエラー
1967 ワード
segmentation faultすなわちセグメントエラーは,一般に不正なアドレス書き込み操作によるものである.
よくあるのは次のような状況です.
1、空のポインタアクセス.
ポインタが空(NULL)の場合、空のポインタの読み書き操作によってsegmentation faultが発生します.
のように
1
2
3
どちらの操作もsegmentation faultになります.
2、ポインタが不正な領域を指した後の書き込み操作.
C言語のポインタは不正な領域を指し、それを書き込むと予知できない結果をもたらし、最も深刻なのはプログラムのクラッシュであり、この時もsegmentation faultである.
たとえば
1
2
3
または
1
2
3
3、定数空間破壊.
たとえば定数文字列では、コンテンツを変更するとsegmentation faultが表示されます.
のように
1
2
4、一部の古いオペレーティングシステムでは、非整列アクセスによってsegmentation faultが発生する可能性があります.
たとえば
1
2
3
4
よくあるのは次のような状況です.
1、空のポインタアクセス.
ポインタが空(NULL)の場合、空のポインタの読み書き操作によってsegmentation faultが発生します.
のように
1
2
3
char
*p = NULL;
printf
(
"%c"
,*p);
//
*p=
'A'
;
// 。
どちらの操作もsegmentation faultになります.
2、ポインタが不正な領域を指した後の書き込み操作.
C言語のポインタは不正な領域を指し、それを書き込むと予知できない結果をもたらし、最も深刻なのはプログラムのクラッシュであり、この時もsegmentation faultである.
たとえば
1
2
3
char
*p =
malloc
(100);
// 100
p+=1000;
// 。
*p=
'a'
;
// segmentation fault
または
1
2
3
char
*p =
malloc
(100);
//
free
(p);
//
*p =
'a'
;
// p , , segmentation fault。
3、定数空間破壊.
たとえば定数文字列では、コンテンツを変更するとsegmentation faultが表示されます.
のように
1
2
char
*p =
"abcdef"
;
//p 。
p[1] =
'M'
;
// , segmentation fault
4、一部の古いオペレーティングシステムでは、非整列アクセスによってsegmentation faultが発生する可能性があります.
たとえば
1
2
3
4
int
a[2];
char
*p1 = (
char
*)a;
// 。
int
*p2 = (
int
*)(p1+1);
// a[0] a[1] , int。 p2 , , 。
*p2=3;
// segmentation fault