C言語:realloc()関数を使用してメモリを再割り当てする
2731 ワード
realloc(void*_ptr,size_t__size):構成済みのメモリ領域を変更します.すなわち、malloc()関数で割り当てられたメモリ領域のサイズを変更します.
割り当てられたメモリを減らすと、reallocはインデックスを変更する情報にすぎません.
割り当てられたメモリを拡張する場合は、次のようになります.1.現在のメモリセグメントの後ろに必要なメモリ領域がある場合は、このメモリ領域を直接拡張し、realloc()は元のポインタを返します.2.現在のメモリセグメントの後の空きバイトが足りない場合は、スタック内の最初のこの要件を満たすメモリブロックを使用して、現在のデータを新しい位置にコピーし、元のデータブロックを解放して、新しいメモリブロックの位置に戻ります.3.申請に失敗した場合、NULLが返され、元のポインタが有効になります.
注意:呼び出しに成功すると、現在のメモリセグメントの後ろの空き領域が要求を満たしているかどうかにかかわらず、元のポインタが解放され、元のポインタが戻されます.元のポインタと同じように、元のポインタが再び解放されない可能性がありますが.
例:
割り当てられたメモリを減らすと、reallocはインデックスを変更する情報にすぎません.
割り当てられたメモリを拡張する場合は、次のようになります.1.現在のメモリセグメントの後ろに必要なメモリ領域がある場合は、このメモリ領域を直接拡張し、realloc()は元のポインタを返します.2.現在のメモリセグメントの後の空きバイトが足りない場合は、スタック内の最初のこの要件を満たすメモリブロックを使用して、現在のデータを新しい位置にコピーし、元のデータブロックを解放して、新しいメモリブロックの位置に戻ります.3.申請に失敗した場合、NULLが返され、元のポインタが有効になります.
注意:呼び出しに成功すると、現在のメモリセグメントの後ろの空き領域が要求を満たしているかどうかにかかわらず、元のポインタが解放され、元のポインタが戻されます.元のポインタと同じように、元のポインタが再び解放されない可能性がありますが.
例:
#include
#include
int main()
{
int size;
int *number1 = NULL;
int *number2;
if ((number1=(int*)malloc(sizeof(int)*5))==NULL)
{
printf("menory allocated unsuccessful
");
exit(1);
}
printf("number1 adress:%d!
",number1);
for (int i = 0; i < 5; i++)
*(number1 + i) = i;
scanf("%d",&sizr);
number2 = (int*)realloc(number1, size*sizeof(int));
if (number2 == NULL)
{
printf("menory allocated unsuccessful
");
exit(1);
}
printf("number2 adress:%d
",&number2);
free(number1);// number1
*number1 = NULL;
return 0;
}