2017-12-13 9 views
2

私は最高値のアドレスを検索し、アドレスに値を増やし、配列を作成します。C配列、ポインタのセグメンテーションフォールト

int main() 
{ 
    int i[5] = {2,5,6,5,3}; 
    int *pi = getAdres(i); 
    (*pi)++; 

    printf("%d", i[2]); 
    return 0; 
} 

getAdres()機能は次のようになります

int getAdres(int *i) 
{ 
    int *pi; 
    int higest = 0; 
    for(int j = 0; j < 5; j++) 
    { 
     if(i[j] > higest) 
     { 
      pi = &i[j]; 
      higest = i[j]; 
     } 
    } 
    return pi; 
} 

getアドレス部分を機能に組み込むことなく機能しますが、現在の形式では(*pi)++;は私にセグメンテーションフォールトを与えています。 何が問題になりますか?

+2

のように呼び出すことができます '場合(I [J]> higest)'真なることはありませんか?あなたは何を返していますか? –

+0

また、コンパイラの警告に注意してください! –

+3

あなたの関数は 'int'を返しますが、' int * 'を返すべきです。おそらく起こるのは、 'int *'が 'int'に切り詰められてsegfaultが発生するということです。 – usr

答えて

2

getAdresint *の代わりに返品タイプintです。

いずれにしても、その実装は悪いです。それはマジックナンバー5を使用し、さらに関数に渡される任意の配列は、例えば負の値しか持たない。

例えば関数定義は

int * getMaxElement(const int *a, size_t n) 
{ 
    size_t highest = 0; 

    for (size_t i = 1; i < n; i++) 
    { 
     if (a[highest] < a[i]) 
     { 
      highest = i; 
     } 
    } 

    return (int *)a + highest; 
} 

のように見えることができ、機能は何

int *pi = getMaxElement(i, sizeof(i)/sizeof(*i)); 
++*pi; 

printf("%d\n", *pi); 
+0

小さなバグが修正されました。 '0' - >' a [0] ' – klutt

+0

@kluttあなたはバグを修正しませんでした。あなたはバグを挿入しました。 –

+0

私は今それを実現します。あなたのコードを誤解します。ごめんなさい。 – klutt

2

あなたは間違った戻り値の型を持って、それを作る:

int * getAddressToMax(int *i); 

また、それが実際に有効なポインタを返すないことを確認してください。配列全体が0の場合、初期化されていないポインタが返されますが、これは本当に悪い考えです。その場合は、最初の要素へのポインタを返すようにしてください:

int *pi = i; 

また、あなたは、一般的に参照してください。その後、

int highest = i[0]; 

1からループを開始し、このようなケースのために。配列の長さを渡すことは、実際のコードでも非常に一般的です。そのような知識をハードコーディングして汎用関数にすることは、物事を理解しにくくします(もちろん、コードの再利用を殺します)。

+0

@ 4386427良い点が編集されました。 – unwind

関連する問題