2012-10-12 64 views
1

根據我對上一個問題的推薦,我改變了我的代碼。現在,我有以下代碼:將系統符號傳遞給char *

char* id = someFunction();  
if (strcmp(id,"0x01") == 0) { 
    unsigned char cbuffer[]={0x01, 0x00}; 
    id=reinterpret_cast<char*>(cbuffer); 
} 

我的問題 - 它是正確的做法,要通過{0x01, 0x00}到char *類型的ID?第二個問題是 - 如何釋放id指針後?

+2

C沒有'reinterpret_cast'重標記爲C++。另外,你永遠不會調用'malloc()'或'new',所以你不需要明確地釋放任何東西。 –

+2

你應該更好地解釋你真正想要完成的事情。 – sth

+0

除非'someFunction()'分配內存,否則它返回一個指向(這將是不好的編碼習慣),你的'id'指向一些函數本地內存,一旦函數返回就不再有效。 – DevSolar

回答

2

當您傳遞指向存儲在自動範圍內的指針時,您發佈的代碼是危險的。緩衝區在離開作用域時會被丟棄(在這種情況下,if的作用域)。

而是嘗試這樣的事:

id = strdup((char*)cbuffer); 

,甚至更好,你可以使用轉義序列,並避免指定char值自己:

id = strdup("\x01"); 

然後,您可以釋放所使用的記憶此字符串使用free

+0

我對非標準'的strdup過敏()'... – DevSolar

+0

'asprintf(ID, 「%S」, 「\ X01」);'將工作太:-P – Will

+0

* AAAACHOOOO * :-D! – DevSolar

3

我懷疑人們實際上在這裏建議了這樣的代碼。如果他們這樣做,他們是魯莽的。 這是代碼不正確的代碼

有機會使用char*std::string並相應地更改someFunction的實施。然而,這隻會在一定程度上有所幫助,因爲目前還不清楚你真的想在這裏做什麼:

是否將{0x01,0x00}傳遞給char *類型的id是正確的方法?

這沒有任何意義。你想實現什麼?這些值是什麼意思,你爲什麼要重新解釋它們作爲一個字符串?如果你只想得到由炭值爲0x01,以下作品的字符串:

std::string result = "\x01"; 
4

你想ID比較字符串值「0×01」或者是你想如果是比較值的ID char ASCII 0x01?

此外,你如何釋放它取決於你如何分配char*返回someFunction()?這個代碼是純C還是C++?如果someFunction()分配使用new char[2],那麼你必須使用delete[]釋放它。如果您使用C風格malloc(sizeof(char)*2)進行分配,那麼您必須執行free(id)

也要考慮在你做strdup之前,正如前一篇文章所建議的,你必須釋放原始的id。這當然假設,如果通過設計,由someFunction()返回的指針不指向某個不應被釋放的全局常量。

char* id = someFunction();  
if (strcmp(id,"0x01") == 0) { // no idea if this line make sense at all. 
    free(id); // or delete[] id; if id is allocated using new char[]; 
    static char[] cbuffer = {0x01, 0x00}; 
    id = (char*) malloc(sizeof(char)*2); 
    strcpy(id, cbuffer); 
}