我试图根据条件分配一个无符号短数组。我遇到的问题如下(根据下面的代码):
错误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;
我无法使用向量来替换我的数组。你有什么想法吗?
答案 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))