0

私は数日前にこのコードを書き始めました。ここで可変引数リストについて疑問に思った質問を見たので、次のコードを書きました (実際には完成していませんが、私が興味を持っていた機能を備えています)。

void VendingMachine::setStamps(int largest, ...)
{
   cout << "Setting stamps to: \n";
   vector<int> tmp;
   vector<int>::iterator iter;
   int next = largest;
   va_list lst;
   va_start(lst, largest);
   while(next != NULL)
   {
      cout << next << "\n";
      tmp.push_back(next);
      next = va_arg(lst,int);
   }
   va_end(lst);

   stamps = new int[tmp.size()-1];

   int i = 0;
   for(iter = tmp.begin(); iter != tmp.end();)
   {
      stamps[i] = *iter;
      iter++;
      i++;
   }

   cout << "The array is now: ";
   showStamps();
}

void VendingMachine::showStamps()
{
   cout << sizeof(stamps) << " " << sizeof(*stamps);
   for(int i = 0; i < NUM_OF(stamps); i++)
      cout << stamps[i] << ", ";
   cout << "\n";
}

さて、私が期待しているのは、setStamps が決して終わらないことです。または、リストが提供されない限り、リストのどの部分も NULL であることが保証されないため、少なくとも非常に長い時間がかかります。そうではありません。setStamps を呼び出すと、次v.setStamps(90,30,24,15,12,10,5,3,2,1);のように出力されます。

スタンプの設定:
90
30
24
15
12
10
5
3
2
1
-217832717
配列は現在: 4 490,

配列の長さを決定する方法を理解しようとしていじり回したので、最後の行を無視します。これは意味がありません。渡された引数の外にある最初の値の後に停止しました。NULL 値が存在するまで継続する必要があり、毎回同じ場所にそれらのいずれかが存在するべきではありません。しかし、結果は常に同じです: 90、30、24、15、12、10、5、3、2、1、[毎回変わる数]。追加の値はありません。謎です。

4

1 に答える 1

0

毎回同じ場所にあるべきではありません

毎回同じ場所にあるわけではないと誰が言いますか? 動作は定義されていないため、毎回同じ場所に NULL 値を持つことは完全に可能です。

于 2012-06-10T03:36:57.947 に答える