【发布时间】:2012-05-07 08:03:14
【问题描述】:
我有以下程序,它将四个字符串存储在地图中并第一次打印。现在它再次运行以检索存储的值。但是第二次的结果和第一次的结果不一样。
#include <map>
using namespace std;
void fun_call(void **,char * );
main(){
void *data=NULL;
char value[100];
int i=0,j=0;
char key[][10]={"disk1","disk2","disk3","disk4"};
cout << "printing all mapped values " << endl ;
data = (void *) malloc( 100);
for(j=0;j<2;j++){
for(i=0;i<4;i++){
fun_call(&data,key[i]);
memcpy(value,data,100);
cout << "key ="<<key[i]<<" value is " << value << endl;
}
cout <<"====================="<< endl;
}
}
void fun_call(void **tmp,char name[10])
{
void *tmp_data;
char str[100]="ravindra";
int len =0;
static std::map<std::string,void *> name_data_map;
std::map<std::string,void *>::iterator iter ;
iter=name_data_map.find(name) ;
if ( iter == name_data_map.end())
{
len=strlen(str)+strlen(name)+1;
tmp_data = (void *) malloc ( len );
strcat(str,name);
memcpy(tmp_data,str,len);
name_data_map[name]=tmp_data;
cout << "Inside the if" << endl ;
}
else
cout << "disk pos "<< iter->first << endl;
cout << "Outside the if" << endl ;
iter=name_data_map.find(name) ;
memcpy(*tmp,iter->second,len);
}
输出:
$ ./a.out 打印所有映射值 如果里面 如果在外面 key =disk1 值为 ravindradisk1 如果里面 如果在外面 key =disk2 值为 ravindradisk2 如果里面 如果在外面 key =disk3 值为 ravindradisk3 如果里面 如果在外面 key =disk4 值为 ravindradisk4 ====================== 磁盘 pos disk1 如果在外面 key =disk1 值为 ravindradisk4 磁盘 pos disk2 如果在外面 key =disk2 值为 ravindradisk4 磁盘 pos disk3 如果在外面 key =disk3 值为 ravindradisk4 磁盘 pos disk4 如果在外面 key =disk4 值为 ravindradisk4知道为什么第二次迭代将所有数据都提供为:“ravindradisk4”
【问题讨论】:
-
所有这些内存复制和指针算法都很难理解。您很可能调用了未定义的行为,但没有注意到。请考虑使用 std::string 并再次询问问题是否没有消失。
-
同意。我想问题出在您分配数组后没有使用
memset将数组初始化为0;无论如何,将 STL 容器与 C 风格的字符串混合使用是一种不好的做法。 -
为什么在使用字符串时将 void* 存储在地图中?你有什么理由不能像这里所做的那样工作类型安全:stackoverflow.com/questions/10333484/…?
-
可以肯定这段代码不能编译。请展示SSCCE 所描述的一个很好的例子