は、だから私はこのコードを持っている:あなたが見ることができるようになぜ再配置するときにヒープからメモリを解放する必要がありますか?
/* Dynamic Array Reader */
/* Parameters:
* n: Number of values to be read
*
* Returns: pointer to the dynamically allocated array
*/
int *dyn_reader(unsigned int n) {
int* array = malloc(n * sizeof (int));
if (!array)
return NULL;
else {
unsigned int num_read = 0;
printf("Enter %u integers so they can be put into this array\n", n);
while (num_read < n) {
num_read += scanf("%d", array + num_read);
}
}
return array;
}
/* Add to array */
/* Parameters:
* arr: Existing array of integers
* num: number of integers in the array before the call
* newval: new value to be added
*
* Returns: pointer to the allocated array
*/
int *add_to_array(int *arr, unsigned int num, int newval) {
int* newarray = realloc(arr, (num+1) * sizeof (int)); //allocate one more space
if (newarray == NULL) //Return original array if failed to allocate
return arr;
//free(arr); //free old array -- this throws an error when i try and free up the old array
newarray[num] = newval;
return newarray;
}
int main()
{
/* testing exercise. Feel free to modify */
int *array = dyn_reader(5);
array = add_to_array(array, 5, 10);
array = add_to_array(array, 6, 100);
array = add_to_array(array, 6, 1000);
return 0;
}
を、主な機能は、アレイ内のn個の要素があることができるようにするための十分なメモリを割り当てdyn_readerを呼び出します。ユーザーから整数を読み込み、配列を返します。
次にmain関数はadd_to_arrayを呼び出し、配列内に1つの加算要素を追加するのに十分なメモリを再配置します。それができなければ、元の配列を返します。メモリの再割り当てが機能するならば、配列の最後にnewvalを追加します。この場合、私は新しいポインタを使用して、新たに再割り当てされた配列の格納場所を格納しています。どうすれば古い配列(free(arr);)を解放しようとすると、エラーが出ます。そのポインタはまだヒープ上のメモリを指していないと私はそれを解放すべきではありませんか?
Reallocは、メモリを移動して拡張できるようにした場合、成功した場合に古い割り当てを割り当て解除します。 – koper89
'realloc'は新しい量のメモリを割り当て、成功した場合は元のメモリブロックをコピーして元のブロックを解放し、最後に新しいメモリブロックへのポインタを返します。成功しない場合、NULLを返しますが、元のメモリは元のままです。 –
reallocは、別のアドレスに移動せずに割り当てを拡張するだけであれば、戻り値として同じポインタを与えることができます。したがって、free(arr)によって新しい割り当て済みメモリを解放します。 – koper89