セグメントエラーが発生した場合の要約

1255 ワード

1.配列へのアクセス時に配列境界を超える
int data[20];
int n;

for (n = 0; n <= 20; n++) {
...
//operate on data[n]
...
}

上で宣言した配列の長さは20ですが、data[20]にアクセスし、配列境界を超え、セグメントエラーが発生します.
2.配列の長さは負
int imgWidth, imgHeight;
long long len = imgWidth * imgHeight;
char imgSize[len];

その中でimgWidth、imgHeightはとても大きくて、lenを負数に計算して、例えば
imgHeight=1997306112 imgWidth=2147483647 imgSize=-1997306112
bufの割り当てに失敗し、Segmentation faultが発生しました
私のこのプログラムは組み込みシステムで実行され、int、long、long long intタイプのデータの長さは同じです.
3.strcpy関数を使用するときにdest bufferの後ろの空間を誤って上書きしました.char *strncpy(char *dest, char *src, size_t num);srcの最初のnum文字がdestにコピーされます.numでコピー長を制限し、dest空間が予期せぬ上書きを防止し、安全です.char *strcpy(char *dest, char *src);通常は文字列コピーに使用され、srcの文字はdestが指す空間にコピーされ、0に遭遇するまでコピーされます.src文字列の長さがdest配列の長さより大きい場合は危険です.
注意:strdup()関数を使用して、上記の方法の代わりに使用することもできますが、使用が完了したらfreeを使用して申請のスペースを解放することを忘れないでください.
#include  
char *strdup(const char *s);

//strdup    
char * __strdup(const char *s)
{
   size_t  len = strlen(s) + 1;
   void *new = malloc(len);
   if (new == NULL)
      return NULL;
   return (char *)memecpy(new,s,len);
}

例:
char *src = "abcd";
char *new = strdup(src);