2015-10-13 64 views
-2

我有結構分配值結構包含在數組成員

struct SerialNumberData* serialNumberArrayTest 

的陣列和我的結構定義爲

struct SerialNumberData 
{ 
    const char* serialNumber; 
    const char* serialNumberPos; 
}; 

什麼IM tryng做的是將值分配給成員結構,然後將結構添加到數組中。我輸入一個循環,其中值被分配給每個結構,然後傳遞給數組。

for(int i=0; i<numArrays;i++){ 
    std::string serial = "serialNumberArray"; 
    oss << i; 
    serial += oss.str(); 
    std::string readLine = "Some value" + serial; 
    size_t pos = 0; 
    std::string token = "Some other value" + serial; 

    serialNumberArrayTest[i].serialNumber = token.c_str(); 
    serialNumberArrayTest[i].serialNumberPos = readLine.c_str(); 
    //..Logger writes the values to an external log file 
    oss.str(""); 
    oss.clear(); 
} 

問題是最後一個結構體的值被保存到數組中包含的所有結構體的值。記錄器在日誌文件中寫入正確的值,但是如果我也在for循環之後再次登錄,則所有值都將被最後一個值覆蓋。

我已經嘗試了很多事情來說明在這一點上,甚至有一個向量,但沒有成功。任何幫助或建議將不勝感激。

+3

您正在存儲指向結構體中的本地('token'和'readLine')的指針。這些當地人在循環後消失,並可能在循環中被覆蓋。在結構中用'std :: string'替換'const char *',並使用'std :: vector'或'std :: array'來存儲結構數組。它會爲你節省很多頭痛。 – crayzeewulf

+2

@crayzeewulf'std :: string'很可能是更好的選擇。 –

+1

@πάνταῥεῖ特別是因爲他使用C++,所以我想不出使用'std :: string'的好理由。 –

回答

1
serialNumberArrayTest[i].serialNumber = token.c_str(); 
serialNumberArrayTest[i].serialNumberPos = readLine.c_str(); 

您正在存儲指向臨時對象的指針。不要這樣做。決定誰管理內存的生命週期並實現它。如果結構管理自己數據的生命週期,請使用:

serialNumberArrayTest[i].serialNumber = strdup (token.c_str()); 
serialNumberArrayTest[i].serialNumberPos = strdup (readLine.c_str()); 
+0

像魅力一樣工作,謝謝! –