-1

重複の可能性:
配列に動的メモリ割り当てを使用する

私はもともと、このプログラムを数量サイズ 10 の価格で販売していましたが、ある時点で 10 個を超えるアイテムを保管する必要がある可能性があるため、プログラムをより動的にしたいと考えました。必要な量のアイテムを保存できるように、追加のメモリを再割り当てする方法を理解するのに苦労しています。これは、このタスクを処理する正しい方法ですか?

主な機能:

double *purchases = (double*)malloc(QUANTITY_SIZE);

外部関数

double startShopping(double *purchases, double *taxAmount, double *subTotal, double *totalPrice)
{
    double itemPrice = 0.00;
    double* storeMoreItems;

    for(int i = 0; i < QUANTITY_SIZE; *subTotal +=purchases[i++])
    {
        while(itemPrice != -1)
        {
            printf("Enter the price of the item :");
            scanf("%lf", &itemPrice); 

            storeMoreItems = (double*)realloc(storeMoreItems, i * sizeof(int));

            if(storeMoreItems != NULL)
            {
                storeMoreItems = purchases;
                purchases[i-1] = itemPrice;
            }

           else
           {
               free(purchases);
           }
       }
  }

  displayCart(purchases);

  *taxAmount = *subTotal * TAX_AMOUNT;

  *totalPrice = *taxAmount + *subTotal;

  printf("\nTotal comes to : $%.2lf\n", *totalPrice);

  return *totalPrice;
}
4

4 に答える 4

1

double* purchases = (double*)malloc(sizeof(double)*QUANTITY_SIZE);

さらに:

storeMoreItems = (double*)realloc(storeMoreItems, i * sizeof(double));

を割り当てようとしi*sizeof(int)、それをにキャストしましたdouble*。サイズが異なる場合doubleintコードでバグを見つけるのは困難です。

次のこと:

が0に等しい場合i、初期サイズが0バイト(i*sizeof(int))のメモリを割り当ててから、それを使用してみます。動作しません。このようにループを変更してみてください:for (int i = 1, i <= QUANTITY_SIZE;...そして保持しpurchases[i-1]ます。

于 2012-12-27T19:23:05.950 に答える
1

これは間違っています:

        if(storeMoreItems != NULL)
        {
            storeMoreItems = purchases;
            purchases[i-1] = itemPrice;
        }

まず、ちょうどrealloced ポインターを上書きします。

purchases = storeMoreItems;

その逆ではなく、そこにあります。しかし、それは、渡されたpurchasesポインターが呼び出し元の関数に持つ値には影響しません。

purchasesそのためには、 fromのアドレスをmaintoに渡す必要があります

double startShopping(double **purchases_ptr, double *taxAmount, double *subTotal, double *totalPrice)

割り当てます

*purchases_ptr = storeMoreItems;

再割り当て自体、

storeMoreItems = (double*)realloc(storeMoreItems, i * sizeof(int));

割り当てるサイズの計算に間違った型を使用しています。これもほぼ間違いなく非常に間違っています。


main

size_t purchase_count = QUANTITY_SIZE;
double *purchases = malloc(purchase_count * sizeof *purchases);
// ...
startShopping(&purchases, &purchase_count, taxAmount, subTotal, totalPrice);
// ...

そして、startShopping次のようになります

double startShopping(double **purchases_ptr, size_t *purchase_count,
                     double *taxAmount, double *subTotal, double *totalPrice)
{
    double itemPrice = 0.00;
    double* purchases = *purchases_ptr;
    size_t i;

    for(i = 0; ; *subTotal += purchases[i++])
    {
        printf("Enter the price of the item :");
        scanf("%lf", &itemPrice);

        // I'm assuming you don't really want to add the -1
        // entered for termination
        if (itemPrice == -1) {
            break;
        }

        if (i == *purchase_count) {
            // array filled, let's get more space
            // double it, or add a fixed amount,
            // but rather not just one element each round
            *purchase_count *= 2;

            // we have the address saved in another variable, so here we can
            // store the pointer returned by realloc in purchases without losing
            // the handle if realloc fails
            purchases = realloc(purchases, *purchase_count * sizeof *purchases);

            if (purchases == NULL) {
                // reallocation failed, now what?

                // throw a tantrum?
                free(*purchases_ptr);
                exit(EXIT_FAILURE);

                // or can something less drastic be done?
            } else {
                // Okay, got the needed space, let's record the address
                *purchases_ptr = purchases;
            }
        }
        purchases[i] = itemPrice;
    }

    // store the number of items actually read in?
    *purchases_count = i;

    // That should probably also get passed the number of items stored
    displayCart(purchases);

    *taxAmount = *subTotal * TAX_AMOUNT;

    *totalPrice = *taxAmount + *subTotal;

    printf("\nTotal comes to : $%.2lf\n", *totalPrice);

    return *totalPrice;
}
于 2012-12-27T19:27:47.167 に答える
0

最初に実行したいのは、正しいバイト数を割り当てていることを確認することです。Mallocは、メモリをdoubleに使用することを認識していないため、次の値を乗算する必要がありますsizeof(double)

double *purchases = (double*)malloc(QUANTITY_SIZE * sizeof(double));
于 2012-12-27T19:22:30.490 に答える
0

再割り当てをチェックしてください。

void * realloc ( void * ptr, size_t size );

メモリブロックの再割り当て ptr が指すメモリブロックのサイズを変更します。

ここから詳細を入手してください http://www.cplusplus.com/reference/cstdlib/realloc/

于 2012-12-27T19:24:08.390 に答える