假設我有一個無符號的char *,我們稱之爲:some_data當我需要一個字符串時,我能用一個無符號字符*做什麼?
unsigned char* some_data;
而且some_data它具有URL的數據等。例如:
"aasdASDASsdfasdfasdf&Foo=cow&asdfasasdfadsfdsafasd"
我有可以抓住「富」的值,如下所示的函數:
// looks for the value of 'foo'
bool grabFooValue(const std::string& p_string, std::string& p_foo_value)
{
size_t start = p_string.find("Foo="), end;
if(start == std::string::npos)
return false;
start += 4;
end = p_string.find_first_of("& ", start);
p_foo_value = p_string.substr(start, end - start);
return true;
}
麻煩的是,我需要一個字符串傳遞給該函數,或至少一個char *(可以轉換爲字符串沒問題)。
我可以通過鑄造解決這個問題:
reinterpret_cast<char *>(some_data)
然後將它傳遞給函數的所有okie-道基
...
直到我使用的valgrind,並發現此會導致細微的內存泄漏。
Conditional jump or move depends on uninitialised value(s) __GI_strlen
從我收集的,它與重釋鑄造搞亂了null,表示字符串的結尾做。因此,當C++試圖找出字符串事物的長度變得棘手時。
鑑於我不能改變some_data由unsigned char *表示的事實,有沒有辦法去使用我的grabFooValue函數而沒有這些細微的問題呢?
我寧願保持我已經擁有了價值發現功能,除非明確有一個更好的方式來撕裂foo的價值了這一點(有時大)的無符號的char *的。
儘管無符號char * some_data的變化,有時還是很大的尺寸,我可以假設'foo'的值會在某個地方早,所以我的想法是嘗試獲取第一個char * X的無符號字符*。這可以通過讓我設置char *結束的位置來消除字符串長度問題。
我試着用strncpy和鑄造,但到目前爲止,還沒有骰子的組合。有什麼想法嗎?
`的reinterpret_cast <>()`不執行任何相對於字符串管理。它所做的只是更改類型而不更改基礎位。這是在與constrast`的static_cast <>()`,這會改變類型,並且可以修改位以轉換將是有意義的(例如`int`到`double`)。 – 2011-02-18 23:55:05
看起來像val-grind的誤報。 – 2011-02-19 00:11:16