在结构中初始化动态数组

时间:2014-02-12 02:57:34

标签: c++ arrays struct

我有一个像这个块的C ++结构形状:

typedef struct _VisibleString
{ 
    uint8_t size;
    unsigned char text[size]; 
}VisibleString, *LPVisibleString;

typedef struct _Device
{
    uint16_t deviceType; 
    uint8_t powerSupplyStatus;  
    VisibleString  manufacturer;
    VisibleString  model;
    VisibleString  revision;
    VisibleString  deviceTag;
    VisibleString  serialNo;
}Device, *LPDevice;
uint16_t numberOfDevices;
Device devicesList[numberOfDevices];

我在考虑使文本中的内容取决于大小。但是,我一直收到错误:

error: invalid use of non-static data member

似乎我无法声明具有动态大小的文本数组。有什么方法可以解决这个问题吗?我正在尝试接收信息,并根据其大小将其分开。

2 个答案:

答案 0 :(得分:0)

这看起来更像C代码。如果你真的在使用C ++,那么我推荐使用std::string的C ++方式而不是尝试自己动态地执行它;让std::string为你照顾。

除非必须,否则不要使用typedef关键字声明结构;这是旧的C方式。

struct VisibleString
{ 
    uint8_t size;
    std::string text; 
};

typedef VisibleString* LPVisibleString;

事实上,您可以简单地使用文本本身,因为text.length()或text.capacity()将为您提供所需的尺寸之一。

要回答您自己的原始问题,我推荐@ Beta的方式:

struct VisibleString
{ 
    uint8_t size;
    unsigned char* text; 
};

稍后,你需要分配内存,并确保自己清理:

VisibleString s;
s.size = 20;
s.text = new unsigned char[size];

try
{
   ...

   delete[] s.text;
}
catch (...)
{
   delete[] s.text;
}

答案 1 :(得分:0)

我不确定我明白你要做什么,所以我会猜测。

你有

Device devicesList[numberOfDevices];

并假设您要将数据放入manufacturer的{​​{1}}字段中。你有数据:

devicesList[2]

uint8_t data_size; unsigned char data[30]; 的值为5,data_size的前5个元素为“Zeiss”。

如果以这种方式定义结构:

data

您可以通过以下方式填写struct VisibleString { uint8_t size; unsigned char *text; }; 字段:

manufacturer

当你不再需要那个字符串时,你应该释放内存:

devicesList[2].manufacturer.size = data_size;
devicesList[2].manufacturer.text = new unsigned char[data_size];
for(uint8_t k=0; k<data_size; ++k)
  devicesList[2].manufacturer.text[k] = data[k];

这是简单粗暴的方式。更简洁,更复杂的方法是使用成员函数和STL容器。我们可以随时向您展示如何做到这一点。