【发布时间】:2011-02-18 23:50:01
【问题描述】:
假设我有一个 unsigned char*,我们称之为:some_data
unsigned char* some_data;
而且 some_data 中有类似 url 的数据。例如:
"aasdASDASsdfasdfasdf&Foo=cow&asdfasasdfadsfdsafasd"
我有一个函数可以获取 'foo' 的值,如下所示:
// 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)
然后将其传递给函数 all okie-dokie
...
直到我使用 valgrind 并发现这会导致细微的内存泄漏。
Conditional jump or move depends on uninitialised value(s) __GI_strlen
从我收集到的信息来看,这与重新解释转换弄乱了指示字符串结尾的空值有关。因此,当 c++ 试图找出字符串的长度时,事情就会变得很棘手。
鉴于我无法改变 some_data 由 unsigned char* 表示的事实,有没有办法在不存在这些微妙问题的情况下使用我的 grabFooValue 函数?
我宁愿保留我已经拥有的价值发现功能,除非显然有更好的方法可以从这个(有时很大)unsigned char* 中提取 foo 值。
尽管 unsigned char* some_data 的大小不同,而且有时很大,但我可以假设 'foo' 的值会在早期某个地方,所以我的想法是尝试获取第一个 X 的 char* unsigned char* 的字符。通过让我设置 char* 结束的位置,这可能会消除字符串长度问题。
我尝试使用 strncpy 和 cast 的组合,但到目前为止还没有骰子。有什么想法吗?
【问题讨论】:
-
reinterpret_cast<>()对字符串管理没有任何作用。它所做的只是改变类型而不改变底层位。这与static_cast<>()形成对比,后者会更改类型并可能修改位,因此转换将是有意义的(例如int到double)。 -
看起来像是来自 val-grind 的误报。
标签: c++ string casting unsigned-char