2016-11-23 3 views
-1

ここでは、Cで動的配列を作成するサンプルコードを示します。単純な動的配列を検索していましたが、単純な配列を見つけることができませんでした。自分のバージョンを実装しました。何か提案は大歓迎です。Cでの動的配列の作成Answer

#include <stdio.h> 
#include <stdlib.h> 

const int MAX_LENGTH_INC=5; 

int main(void) 
{ 

    int *ptr,i; 
    int maximum_array_size = 1; 
    int index=0; 
    ptr = malloc(MAX_LENGTH_INC * sizeof(int)); 

    printf("Address of previously allocated memory: "); 
    for(i = 0; i < 8; i++) // incrementing upto maximum of size 8 
    { 
     //printf("\n Pointer is:%u\t",ptr + i); 
     //printf("\nindex is: %d",index); 
     ptr[index] = i*2; 
     //printf("\nValue :%d\t",ptr[index]); 

     index++; 
     if(index == maximum_array_size) 
     { 
      //printf("\n Array reached its limit"); 
      ptr= realloc(ptr,sizeof(int)*MAX_LENGTH_INC); 
      maximum_array_size = maximum_array_size + MAX_LENGTH_INC; 
     } 
    } 
    for(i=0;i<index;i++) 
     printf("\n Array Value is %d ",ptr[i]); 
    free(ptr); 

    return 0; 

}

+0

['malloc()'と 'C'のファミリの戻り値をキャストしない理由については、このディスカッションを参照してください。](http://stackoverflow.com/q/605845/2173917)。 –

+0

動作しても、パフォーマンスは各要素の再配置の非常に低い側にあります.... –

+0

'i

答えて

-1

[OK]を、あなたは私がステップバイステップでそれらを掘るせ、ここでいくつかの問題を得ました。

#include <stdio.h> 
#include <stdlib.h> 

const int MAX_LENGTH_INC=1; 

Cにはconstキーワードがありますが、このような定数を定義するためには使用しないことをお勧めします。代わりに、ちょうどので、同じように#defineを使用します。

#define MAX_LENGTH_INC 1 

しかし、const int MAX_LENGTH_INC = 1;が間違っていないので、あなたがそれを好きならば、あなたはそれを維持します。

int main(void) 
{ 

修正。代替:int main(int argc, char * argv[]) {。このようにして、プログラムの呼び出し元はコマンドライン引数を渡すことができます。彼のプログラムでは明らかにあなたはそれを必要としないので、voidは問題ありません。

int *ptr,i; 
    int maximum_array_size = 1; 

ので、覚えておいてください:これは、アレイのご現在サイズです。あなたは実際に、私は推測、MAX_LENGTH_INCでとても良く書き込みを開始したい:

int maximum_array_size = MAX_LENGTH_INC; 

この方法では、あなたがMAX_LENGTH_INCを増やすならば、あなたもだけでなく、その後のものの、あなたの最初の割り当てのサイズを増やします。

int index=0; 
    ptr = (int*) malloc(MAX_LENGTH_INC * sizeof(int)); 

コメントが既にあります:mallocの戻り値をキャストしないでください。また:あなたはので、ここで変数maximum_array_sizeを使用する必要があります。

ptr = malloc(maximum_array_size * sizeof(int)); 

sizeof(int)を使用してちょうどそれをここで注意することは、C ではかなり一般的なスタイルです:sizeofは機能が、演算子ではありません。したがって、sizeof intも有効です。。 /編集:

   ptr=(int *)realloc(ptr,sizeof(int)*MAX_LENGTH_INC); 
      maximum_array_size = maximum_array_size + MAX_LENGTH_INC; 

あなたは常にreallocMAX_LENGTH_INC要素を格納する配列:

printf("Address of previously allocated memory: "); 
    for(i = 0; i < 8; ++i) 
    { 
     //printf("\n Pointer is:%u\t",ptr + i); 
     //printf("\nindex is: %d",index); 
     ptr[index] = i*2; 
     //printf("\nValue :%d\t",ptr[index]); 

     index++; 
     if(index == maximum_array_size) 
     { 
      //printf("\n Array reached its limit"); 

をコメントし、ここにあなたのロジックの問題が来る参照してください。あなたはそれが育っているはずですが、実際には成長していないことを覚えています。したがって、最初に、mallocコールで上記の2つの回線を交換した後、reallocコールの変数を使用します。

   maximum_array_size = maximum_array_size + MAX_LENGTH_INC; 
      ptr = realloc(ptr, maximum_array_size * sizeof(int)); 

加えmaximum_array_size = maximum_array_size + MAX_LENGTH_INC;maximum_array_size += MAX_LENGTH_INC;のように記述することができます。これは実際にコードを読むのに役立ちます。なぜなら今すぐすぐに値MAX_LENGTH_INCmaximum_array_sizeに追加されます。

次に、sizeof(int) * numまたはnum * sizeof(int)のどちらを書き込むかを決定する必要があります。num * sizeof(int)はより論理的です。なぜなら、20の整数ではなく20のintではないからです。)

コメントからのもう1つの提案は、それぞれの繰り返しが1ずつ増加すると、長いループでは非常に遅くなります。だから、より良いダブルバッファサイズ各反復:

   maximum_array_size *= 2; 
      ++maximum_array_size; // not exactly needed, I like it this way 

さて、あなたはバッファのビットを無駄かもしれないが、あなたは高々50%を無駄にします。もちろん、新しい変数:num_array_elementsを追加する必要があります。なぜなら、maximum_array_sizeは要素の数をそれ以上カウントしないからです。

再び
 } 
    } 
    for(i=0;i<sizeof(ptr);i++) 
     printf("\n Array Value is %d ",ptr[i]); 

コメントはすでにそれを告げ:sizeof(ptr)はここに決定的に間違っています。理由は:ptrはポインタです。ポインタのサイズは、それが指し示すメモリブロックのサイズにかかわらず、常に同じ(すなわち、8バイト)である。新しい変数num_array_elementsをここで使用します。

次に、ここのような1つのライナーステートメントでも、中括弧を追加する必要があります。時間が来たら、別の行を追加して中括弧を追加するのを忘れて、本当にバグを見つけにくくします。だから:

for (i = 0; i < num_array_elements; i++) { 
     printf("\n Array Value is %d ", ptr[i]); 
    } 

また、私はいくつかのスペースを追加しました。スペースを使用するとコードを読みやすくなります。 forifのような制御フローのキーワードは、通常、次のスペースで書き込まれます。言語は気にしませんが、広く採用されています。

free(ptr); 

    return 0; 
} 

残りは問題ありません。実際には変数num_array_elementsを追加して実装し、maximum_array_sizeの名前をarray_sizeまたはmaximum_array_elementsに変更することもできます。また、maximumの代わりにmaxを書くことは、numberの代わりにnumと書くのと同様に広く採用されています。

+1

'sizeof 2'は正常に動作しますが、' sizeof int'はコンパイルに失敗します。式ではなく、型にはカッコを省略できます。 –

+0

ありがとう、ヒントのために、それを知らなかった。 –

+0

とにかく、今私は知っている、なぜ人々はちょうど括弧を書くことに固執するすべての時間。 –

関連する問題