0

非常に基本的な方法で realloc を実装するのに問題があります。

**ret でメモリの領域を拡張しようとしています。これはret = realloc(ret, newsize);、デバッグ文字列に基づいて構造体の配列を指しています。ループの過程で newsize が正しく増加していることがわかっています (元のサイズの 4 から8 から 12 など)、しかし、私が行うsizeof(ptr)と、元のサイズの 4 が返され、新しく割り当てられたスペースに配置しようとしているものが見つかりません (私はそれをに絞り込んだと思います) realloc() これが、質問をこのようにフォーマットしている理由です)

問題がすぐに明らかにならない場合は、関数全体を投稿できます。宿題で「ごまかし」すぎないようにしているだけです(とにかく、コードは現在、printfを多用しているため、ちょっと面倒です) () デバッグ用)。

[編集]さて、あなたの答えに基づいて、コードのデバッグに失敗しているので、関数全体を投稿して、私が間違っていることについて詳しく教えてください。

(そのほとんどは動作していないデバッグであるため、printf() は無視できます)

 Booking **bookingSelectPaid(Booking **booking)  {
     Booking **ret = malloc(sizeof(Booking*));
     printf("Initial address of ret = %p\n", ret);
     size_t i = 0;
     int numOfPaid = 0;
     while (booking[i] != NULL)
     {
         if (booking[i]->paid == 1)
         {
             printf("Paying customer! sizeof(Booking*) = %d\n", (int)sizeof(Booking*));
             ++numOfPaid;
             size_t newsize = sizeof(Booking*) * (numOfPaid + 1);
             printf("Newsize = %d\n", (int)newsize);
             Booking **temp = realloc(NULL, (size_t)newsize);
             if (temp != NULL)
                 printf("Expansion success! => %p sizeof(new pointer) = %d ret = %p\n", temp, (int)sizeof(temp), ret);
             ret = realloc(ret, newsize);
             ret[i] = booking[i];
             ret[i+1] = NULL;
         }
         ++i;
         printf("Sizeof(ret) = %d numOfPaid = %d\n", (int)sizeof(ret), numOfPaid);
     }
     return ret; }

[EDIT2] --> http://pastebin.com/xjzUBmPg

[EDIT3] 明確にするために、printf、一時ポインター、およびその性質のものはデバッグであり、意図した機能の一部ではありません。私を困惑させている行は、またはのいずれかrealloc(ret, newsize);ですret[i] = booking[i]

基本的に、予約には NULL で終わる構造体のテーブルが含まれていることは確かです。特定の値が 1 (有料) に設定されているものを新しいテーブルに持ち込もうとしています。これが私の main() です。この関数から取得しようとしています...では、どこが間違っているのでしょうか?

4

3 に答える 3

2

ここでの問題はsizeof(ptr)、アーキテクチャに依存するポインタのサイズのみを返すことだと思います(4と言うので、32ビットシステムを実行していることになります)。

メモリを動的に割り当てる場合は、そのサイズを自分で追跡する必要があります。

于 2012-06-24T16:48:22.037 に答える
0

はい、 sizeof(ptr) は定数です。他の答えが言うように、アーキテクチャに依存します。32 ビット アーキテクチャでは 4 になり、64 ビット アーキテクチャでは 8 になります

幸運を。

于 2012-06-25T08:16:26.627 に答える
0

sizeof(ptr)割り当てられたサイズではなく、ポインターのサイズを返すため

于 2012-06-24T16:48:36.087 に答える