クラスメートの 1 人がコードを送ってきて、何が問題なのか尋ねました。それは次のようなものでした:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int *d_array, number, divisor_count, i, size = 1;
char answer;
d_array = (int*) malloc(size * sizeof(int));
do
{
printf("\nEnter a number: ");
scanf("%d", &number);
divisor_count = 0;
for(i = 2; i < number; i++)
if (number % i == 0) divisor_count++;
if(divisor_count == 0)
{
realloc(d_array,(size + 1) * sizeof(int));
d_array[size - 1] = number;
size++;
}
printf("\nIs there another number? y/n ");
getchar();
answer = getchar();
} while (answer == 'y');
for(i = 0; i < size - 1; i++)
printf("\n%d", d_array[i]);
return 0;
}
ユーザーから数字を取得し、素数の数字を保持して、最後にそれらを出力することになっています。私のコンピューターの出力は次のようなものです。
Enter a number: 3
Is there another number? y/n y
Enter a number: 5
Is there another number? y/n y
Enter a number: 8
Is there another number? y/n y
Enter a number: 7
Is there another number? y/n y
Enter a number: 2
Is there another number? y/n n
4072680
5
7
2
コードには他にもありましたが、最大の問題は明らかに realloc() の戻り値を割り当てていないことです。しかし、奇妙なことは、私の質問ですが、なぜこのコードは最初の素数が正しくなく、他の素数が正しく表示されるのでしょうか? 動的配列のアドレスは変更される可能性がありますが、最初のものではなく、2 番目のものと残りの部分が正しいのはなぜですか?
編集:わかりました、私がこれを尋ねた理由は、このコードでの realloc() の動作を理解しようとすることでした。適切なリソースがあれば共有してください。メモリを再割り当てするとき (古いメモリを解放するとき)、realloc() は古いメモリ位置の内容を変更しますか?