根据条件分配数组大小

时间:2012-04-04 09:03:33

标签: c++ arrays visual-c++

我试图根据条件分配一个无符号短数组。我遇到的问题如下(根据下面的代码):

错误C2057:预期的常量表达
错误C2466:无法分配具有恒定大小0的数组 错误C2133:'包':未知大小

unsigned int length=4;
if(...)
{
    length = 8;
}
else if(...)
{
    length = 6;
}
else
{
    length = 4;
}

unsigned short packet[length/2];

我尝试做一些恶作剧,比如在数组声明之前添加它并将其用于数组大小,但它没有做到这一点:

const unsigned int halfLength=length/2;

我无法使用向量来替换我的数组。你有什么想法吗?

5 个答案:

答案 0 :(得分:4)

是的,动态分配数组:

unsigned short* packet = new unsigned short[length/2];

您无法在运行时指定自动存储分配数组的大小。

你还必须自己释放记忆:

delete[] packet;

答案 1 :(得分:0)

我会把它带到一个类来避免内存泄漏:

template <class T1> class array
{
public:
  array( size_t size )
    : addr(0)
  {
    if ( size > 0 )
      this->addr = new T1[size];
  };
  ~array( void )
  {
    if ( this->addr != 0 )
    {
      delete [] this->addr;
      this->addr = 0;
    }
  };
  T1 & operator[]( size_t index )
  {
    return this->addr[index];
  };
  bool empty( void ) { return (this->addr != 0); };
private:
  T1 * addr;
};

array<unsigned short> packet(length/2);

答案 2 :(得分:0)

C样式数组中的元素数必须是整数常量 用C ++表达。 (C90对非常量表达式有一些支持 在这里,但我不熟悉它。)显而易见的答案是 std::vector,但你说你不能使用它。如果是这样的话,你 可能也不能使用动态分配;否则,指针和 可以使用new unsigned short[length / 2],但您必须这样做 确保在完成操作时也会出现delete[],包括 如果你通过例外离开范围 - 最后,你就不远了 从本地实现了大约一半的std::vector

如果您的代码提取不是太简单:为什么不保留 最大长度,例如:

unsigned short packet[8 / 2];

在您的示例中,最大的length为8,并始终保留为8 不会造成任何问题。 (显然,如果实际length 可以使用来自外部函数等的值来改变更多 可能不是一个现实的解决方案。但如果是......为什么复杂 什么时候可以做到简单?)

答案 3 :(得分:-2)

对于c程序员:

//length value is dynamically assigned
int length=10;

//runtime allocation
unsigned short * f = (unsigned short *) malloc (length/2 * sizeof(unsigned short));

//use the vector
f[0]=1;

...

//free the memory once the program does not need more
free(f);
f=NULL;

答案 4 :(得分:-3)

您无法动态分配数组的大小。 您可以使用指针来分配数组的动态大小。

int * t = malloc(a * sizeof(int))