realloc()
いくつかの配列を動的にサイズ変更するために使用しています。私は次のようなコードをたくさん書いていたからです:
void *tmp;
if( (tmp = realloc(myobject, sizeof(object) * newsize) != NULL)
myobject = tmp
次のようなことをしてコードを短くしようと思いました (ばかげた考え):
void GetSpace(void *ptr, size_t size_of_object, int newsize){
void *tmp = NULL;
if ((tmp = realloc(ptr, size_of_object * newsize) == NULL)
//print error msg and exit
else
ptr = tmp;
}
int main(){
//This is an example
double *mydata1 = (double *)malloc (sizeof double * 5);
//later request more space for mydata1
GetSpace( mydata1, sizeof(double), 50);
}
多くの行を節約したり、コードを読みやすくしたりしないため、これはばかげていますが、期待どおりに機能しない理由を知りたいです。GetSpace()
単一のオブジェクトに対してのみ使用すると、正常に機能します。関数を呼び出すオブジェクトを初期化せずにコードを実行すると、問題なく実行されますが、オブジェクトを呼び出してからGetSpace()
データを入れてからGetSpace()
別のオブジェクトを呼び出すと、次のようなメッセージでスタック トレースが表示されます。
*** glibc detected *** ./a.out: realloc(): invalid old size: 0x00007fff05d96790 ***
0x00007fff05d96790
サイズ変更前の 2 番目の配列/オブジェクトのアドレスです。なぜこれが起こるのですか?