2014-09-11 21 views
1

我正在處理一段代碼,並且遇到了void pointer和char問題。基本上,在序列化函數中,我們會有一個新的字符。我們需要在buffer中存儲該字符。這裏是序列化函數的簽名。處理空指針和C++中的字符

void serialize(void *buffer, 
       //some other inputs here 
      ){ 
std::string str = ""; 
/*some code here, store the final output in str first*/ 

char* charStr = new char[str.size()]; 
strcpy(charStr,str.c_str()); 
buffer = static_cast<void*>(charStr); 
} 

使用這樣的功能,

char buffer[256]; 
serialize(buffer, 
      //some other inputs here 
); 

然而,存儲在buffer數據將是實實在在的事奇怪。我將簽名中的void指針改爲char指針作爲臨時解決方案。但是,我知道必須有更好的一個。

+1

注意'strcpy'會在字符串的末尾放置一個空終止字符,而不是用'str.size()'計數(所以你會得到一個帶有發佈代碼的緩衝區溢出)。 – SleuthEye 2014-09-11 01:37:24

+0

你知道'buffer = ...'賦值對調用者的參數有絕對的**沒有**效果,對吧? – WhozCraig 2014-09-11 01:39:33

+0

我會改變緩衝區參數的類型爲char *。爲什麼使用void,因爲它確實是一個指向原始內存(字節)的指針?否則,我喜歡扎克的答案。 – 2014-09-11 02:01:33

回答

1

如果你想填充一個緩衝區,你不能指定它(只會覆蓋指針,保持原始緩衝區內容不變)。在serialize(charStr)中也不需要臨時緩衝區。您可以直接STRCPY輸出緩衝區,這樣的:

void serialize(void *buffer 
      ){ 
    std::string str = "foo bar baz"; 
    strcpy((char *)buffer, str.c_str()); 
} 
0

把它定義爲

void serialize(void *& buffer, 
        //some other inputs here 
       ){ 

使用指針作爲參數,記得刪除緩存

char* buffer; 
serialize(buffer, 
      //some other inputs here 
); 
+0

此選項不能用作'char buffer [256];序列化(緩衝區,按照OP指定 – 2014-09-11 02:21:49