假设我有一个无符号的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