0

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

错误 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;

我不能使用向量来替换我的数组。你有什么主意吗 ?

4

5 回答 5

4

是的,动态分配的数组:

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

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

您还必须自己释放内存:

delete[] packet;
于 2012-04-04T09:04:17.600 回答
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);
于 2012-04-04T09:14:57.600 回答
0

C 样式数组中的元素数量必须是 C++ 中的整数常量表达式。(C90 在这里对非常量表达式有一些支持,但我不熟悉它。)显而易见的答案是 std::vector,但你说你不能使用它。如果是这种情况,您可能也不能使用动态分配;否则, new unsigned short[length / 2]可以使用delete[]指针和std::vector本地。

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

unsigned short packet[8 / 2];

在您的示例中,最大length的是 8,并且始终保留 8 不会导致任何问题。(显然,如果实际length 值可能因来自外部函数等的值而变化更大,这可能不是一个现实的解决方案。但如果是......为什么可以做简单的事情却做复杂的事情?)

于 2012-04-04T09:18:23.307 回答
-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;
于 2012-04-04T09:15:29.690 回答
-3

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

int * t = malloc(a * sizeof(int))
于 2012-04-04T09:06:15.417 回答