2013-03-22 131 views
2

我正在使用Qt Creator開發應用程序。C++:複製結構數組並返回結構數組

我不是一個很好的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的大小,它給而大小_OA_Packet給出

因此,當嘗試顯示結構的內容,其與「分段錯誤」

任何意見,建議返回??

+2

'_packetStruct'是一個指針。 'sizeof'給你的指針大小不是指針指向的內存大小。指針指向一個足夠大的內存位置,通過使用'new'分配給它。另外,你不應該爲類使用'memcpy'。相反,您應該爲該類重載複製賦值運算符'='。 – 2013-03-22 08:21:18

+0

@Alok,謝謝你的回覆。 最初我嘗試使用賦值運算符,但錯誤是一樣的。所以我轉向了這個概念。你能提供一些提示/例子嗎?我可能在我的情況下做錯了什麼? – skg 2013-03-22 08:30:35

+1

需要考慮的幾點(儘管與您的問題沒有直接關係):1)所有大寫字母名稱通常用於宏,因此您可能不想將其用於類型(可能會讓其他人閱讀代碼時感到困惑)。 2)'typedef struct ...'在C中很有用,但在C++中是不必要的。 'struct COMMAND_PACKET_STRUCT {...};'也可以。 3)用更安全更容易的'std :: copy'替換'memcpy' 4)查看智能指針以避免內存泄漏。 – Grizzly 2013-03-22 08:55:37

回答

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 
    
+0

感謝您的回覆。我需要複製存儲在「_OA_Packet」中的完整結構數組。所以如果我把「sizeof(_packetStruct)」 - >應該返回48(即sizeof(_OA_Packet))。上述代碼將複製[index]處的結構。 請原諒我,如果我錯了。但我需要將存儲在「_OA_Packet」中的結構數組複製到「_packetStruct」,然後從函數中返回這個結構數組。 – skg 2013-03-22 09:43:56

+0

嗨skg,我更新了代碼,將_OA_Packet的所有內容複製到_packetStruct。你還需要注意刪除[] packetStruct,否則內存泄漏 – JiuDong 2013-03-22 10:13:35

+0

感謝編輯。我有一個問題。 sizeof(* _ packetStruct) - >給出12.如何在複製之後從「_packetStruct」中獲取「_OA_Packet」的大小。 (即_packetStruct應該給出48(_OA_Packet的大小))。 我需要Sizeof _OA_Packet,因爲在傳遞結構的返回數組作爲參數的函數中,我需要從結構數組中檢索值。爲了做到這一點,我應該知道結構陣列的實際尺寸。 請爲我提供相同的建議。我非常感謝你的建議。 – skg 2013-03-22 10:55:20