C ++:复制结构数组并返回结构数组

时间:2013-03-22 08:18:05

标签: c++ arrays qt structure

我正在使用Qt Creator开发应用程序。

我不是一个优秀的C ++程序员,因此可能存在概念错误等。

复制结构数组并返回结构时,我遇到了一个问题。

有很多与类似标题相关的解决方案,但无法解决我的问题。

这是我的代码:

ABC.h

typedef struct command_packet_struct
{
    QString ItemDataName;
    DATA_TYPE ItemDataType;
    int ItemDataLength;
} COMMAND_PACKET_STRUCT;

class ABC 
{
private:

    COMMAND_PACKET_STRUCT* getHeaderTitle(int index);
    COMMAND_PACKET_STRUCT *_packetStruct ;
};

ABC.cpp

COMMAND_PACKET_STRUCT _OA_Packet [] = {
    {"ERROR\nMAIN CODE" ,       DATA_TYPE_NUM,          5 },
    {"ERROR\nSUB CODE"  ,       DATA_TYPE_NUM,          4 },
    {"SCALE VERSION"    ,       DATA_TYPE_ASCII,        8 },
    {"E-PRE VERSION"    ,       DATA_TYPE_ASCII,        8 }
};

COMMAND_PACKET_STRUCT* PCU_SIM_ORDER_TASK::getHeaderTitle(int index)
{
    int maxSize;

    if (_packetStruct != NULL)
    {
        _packetStruct = 0;
    }

    _packetStruct = new COMMAND_PACKET_STRUCT(*_OA_Packet);
    maxSize = ((sizeof(_OA_Packet)/sizeof(COMMAND_PACKET_STRUCT)) - 1);
    memcpy(_packetStruct, _OA_Packet, maxSize) ;

    qDebug() << sizeof(COMMAND_PACKET_STRUCT);       // return 12
    qDebug() << sizeof(_packetStruct);               // return 4
    qDebug() << sizeof(_OA_Packet);                  // return 48

    return _packetStruct;
}

上面的代码显示了我为结构数组所做的实现。

我需要复制结构数组

           _OA_Packet

           _packetStruct

但是当我尝试获得 _packetStruct 的大小时,它会提供 4 ,而 _OA_Packet 的大小会提供 48 < /强>

因此,当试图显示结构的内容时,它返回“分段错误错误”

任何想法,建议??

1 个答案:

答案 0 :(得分:1)

  1. 您的结构COMMAND_PACKET_STRUCT应该在C ++中定义如下

    struct COMMAND_PACKET_STRUCT 
    {
     QString ItemDataName;
     DATA_TYPE ItemDataType;
     int ItemDataLength;
    };
    
  2. 使用默认构造函数来分配空间。

    maxSize = ((sizeof(_OA_Packet)/sizeof(COMMAND_PACKET_STRUCT)));   
    _packetStruct = new COMMAND_PACKET_STRUCT[maxSize];
    
  3. 复制内容。

    std::copy(_OA_Packet,_OA_Packet+maxSize,_packetStruct);
    
  4. _packetStruct是指针,你可能想检查它指向的数据大小。

    qDebug() << sizeof(*_packetStruct);               // return 4 -->will be 12