2017-01-01 15 views
0

この小さなC関数を書いて、配列から整数を削除しました。整数の配列から値を削除する

/* remove `count` integers from `arr`, starting at index `idx` */ 
void remove_int(int (*arr)[100], int idx, int count) 
{ 
    int i, j; 

    for (i = 0; i < count; i++) 
     for (j = idx; *arr[j]; j++) 
      *arr[j] = *arr[j+1]; 
} 

は、私はこのようにそれを実行して言ってやるがいい。

int arr[100] = {25, 4, 4, 1, 2, 1, 2}; 

remove_int(&arr, 7, 2); 

私はセグメンテーションフォールトを取得します。どうして? BLUEPIXYによって

EDITCommentchqrlieによってanswerはそれを説明し、それを解決しました。みんなありがとう!

+4

'* arr [j]' - > '(* arr)[j]' – BLUEPIXY

+1

あなたの関数は 'idx'を使用していませんか? – RoadRunner

+2

BTW 'remove_int(&arr、7、2);' - > 'remove_int(&arr、2、7);'? – BLUEPIXY

答えて

3

あなたのコードでは、あなたはそれがないと思う何をしていません。

  • arrは100個のint要素の配列へのポインタとして定義されています。
  • arr[j]は、オフセットjの要素を指しているのではなく、arrが指す配列のjの配列を指しています。
  • *arr[j]は、呼び出し元関数のarr配列の終わりをはるかに超えて、位置arr[j][0]の整数を参照しません。

あなたは同じAPIを続ける場合は、コードをこのように書く必要があります。

/* remove `count` integers from `arr`, starting at index `idx` */ 
void remove_int(int (*arr)[100], int idx, int count) { 
    int i, j; 
    for (i = idx + count; i < 100 && (*arr)[i]; i++) 
     (*arr)[i - count] = (*arr)[i]; 
    for (j = 0; j < count && i - count + j < 100; j++) { 
     (*arr)[i - count + j] = 0; 
} 

それは、配列へのポインタを処理するためにCで慣用ではない、単に直接配列を渡すことがより一般的です呼び出された関数は配列の最初の要素へのポインタを受け取ります。

機能は、この方法で呼び出されます:

int arr[100] = {25, 4, 4, 1, 2, 1, 2}; 

remove_int(arr, 7, 2); 

そして機能がこのように書かれます:

この場合
/* remove `count` integers from `arr`, starting at index `idx` */ 
void remove_int(int arr[100], int idx, int count) { 
    int i, j; 
    for (i = idx + count; i < 100 && arr[i]; i++) 
     arr[i - count] = arr[i]; 
    for (j = 0; j < count && i - count + j < 100; j++) { 
     arr[i - count + j] = 0; 
} 

[100]配列のサイズは無視され、機能が振る舞いますvoid remove_int(int *arr, int idx, int count)

関連する問題