[英]find with char* variable doesnt work
我想知道为什么我有一个内存错误:
问题出现在char * value = aMap.find(keync)-> second
如果我手动输入char * value =“ key0”,它将起作用!!!
using std::map;
map <char*, char*> aMap;
void search(const char* key) {
const int LEN = strlen(key);
char* keync = new char[LEN];
for (int i= 0; i < LEN; i++) {
keync[i] = key[i];
}
char* value = aMap.find(keync)->second;
printf("%s", value);
delete[] keync;
}
int _tmain(int argc, _TCHAR* argv[])
{
a["key0"] = "value0";
search("key0");
return 0;
}
您需要在数组长度上加1:
char* keync = new char[LEN+1];
您在分配的字符串之外终止为null。
(此外,您正在初始化aMap吗?)
正如其他人指出的那样,您最好使用std::string
。 现在,对于实际的问题,为什么您找不到字符串是因为您将指针存储在映射中,即映射的键是指针变量。 您在地图中插入了一个char*
,但是当您尝试查找时,您又在做new
。 这是一个完全不同的指针(尽管它们指向的字符串值相同),因此您的查找将失败。
一个明显的问题是:
delete keync;
因为您使用了new [],所以它应该是:
delete[] keync;
您最好使用std :: string代替char *。 使用std :: string的另一个好处是可以避免内存泄漏。
另一个解决方案是为map提供比较器功能,否则它们将不比较每个char *的内容,而是比较所指向的地址。 以下示例改编自Sgi的std :: map文档:
struct comp
{
bool operator()(char* s1, char* s2) const
{
return strcmp(s1, s2) < 0;
}
};
map<char*, char*, comp> stringMap;
好吧,对于初学者,您应该删除所有char *内容并使用std::string
,这可能会使您的问题消失。
仅供参考:
keync[LEN] = '\\0';
//这是错误的,并且将在分配的数组的末尾
键参数的复制是错误的。 尝试以下尺寸:
using std::map;
map <char*, char*> aMap;
void search(const char* key) {
const int LEN = strlen(key);
char* keync = const_cast<char*>(key);
char* value = aMap.find(keync)->second;
printf("%s", value);
}
int main(int argc, char** argv)
{
aMap["key0"] = "value0";
search("key0");
return 0;
}
您遇到的问题是因为您将keync
分配为strlen(key)
而不计算空终止符。 然后,在复制循环中,您将用key
的最后一个字符覆盖null终止符。
复制输入字符串的整个想法是错误的,我在我的解决方案中将其替换为const,因为这样做更有意义(就目前而言)。
using std::map;
map <char*, char*> aMap;
首先,此地图将不比较字符串(在搜索范围内),而是比较地址。 因此,基本上,通过键入字符串文字,您将不会在std :: map :: search中找到任何内容。
void search(const char* key) {
const int LEN = strlen(key);
char* keync = new char[LEN];
for (int i= 0; i < LEN; i++) {
keync[i] = key[i];
}
目前,您的字符串没有终止,但是在您的代码中没关系
char* value = aMap.find(keync)->second;
在这里,您通过比较指针值(地址)来执行搜索,因此返回的地图迭代器无效(等于aMap.end()),因此它具有null或未分配的指针作为second
成员
printf("%s", value);
delete[] keync;
}
int _tmain(int argc, _TCHAR* argv[])
{
a["key0"] = "value0";
search("key0");
return 0;
}
我希望它能解释您为什么应该使用std :: string而不是char *
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.