为什么这段代码有用呢?

时间:2012-06-10 03:27:12

标签: c++ variadic-functions

我几天前开始编写此代码。我在这里看到一个问题让我对变量参数列表感到疑惑,所以我写了(从未真正完成,但它具有我很好奇的功能)这段代码:

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。事实并非如此。我用v.setStamps(90,30,24,15,12,10,5,3,2,1);调用setStamps并打印出来:

  

将印章设置为:
  90个
  30个
  24个
  15个
  12个
  10个
  5
  3
  2
  1
  -217832717
  阵列现在是:4 490,

忽略最后一行,因为那是我在试图弄清楚如何确定数组的长度,这没有意义。它在传递的参数之外的第一个值之后停止。它应该一直持续到有一个NULL值,并且每次都不应该有一个在同一个地方。但结果总是相同的:90,30,24,15,12,10,5,3,2,1,[每次改变的数字]。从来没有任何额外的价值观。这是一个谜。

1 个答案:

答案 0 :(得分:0)

  

每次都不应该有同一个地方的其中一个

谁说每次都不会在同一个地方?行为是未定义的,因此每次在同一个地方都有一个NULL值是完全可能的。