[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;
あなたは常にrealloc
MAX_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_INC
がmaximum_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]);
}
また、私はいくつかのスペースを追加しました。スペースを使用するとコードを読みやすくなります。 for
とif
のような制御フローのキーワードは、通常、次のスペースで書き込まれます。言語は気にしませんが、広く採用されています。
free(ptr);
return 0;
}
残りは問題ありません。実際には変数num_array_elements
を追加して実装し、maximum_array_size
の名前をarray_size
またはmaximum_array_elements
に変更することもできます。また、maximum
の代わりにmax
を書くことは、number
の代わりにnum
と書くのと同様に広く採用されています。
['malloc()'と 'C'のファミリの戻り値をキャストしない理由については、このディスカッションを参照してください。](http://stackoverflow.com/q/605845/2173917)。 –
動作しても、パフォーマンスは各要素の再配置の非常に低い側にあります.... –
'i