我想通过引用函数传递一个映射。 这是代码:
void test(map<int, double *> &a);
int main(){
map<int, double *> a;
test(a);
cout << a[1][1] << endl;
return 0;
}
void test(map<int, double*> &a)
{
double red[] = {1.1, 2, 3};
a[1] = red;
}
问题在于,[1] [1]应该是2.但是,当我执行程序时,它会给出一个像1.73e120这样的大数字!!!
答案 0 :(得分:4)
你的地图将ints映射到指向double的指针。在函数内添加元素时,就像在此处一样,
a[1] = red; // points to first element of local red[] array
地图正在复制指向局部变量的指针。它指向的地址在test
函数之外没有意义。指针不是数组,数组不是指针。
您可以通过使用向量映射来解决问题:
std::map<int, std::vector<double>>
然后
void test(std::map<int, std::vector<double>> &a)
{
a[1] = std::vector<double>{1.1, 2., 3.};
}
答案 1 :(得分:4)
double red[] = {1.1, 2, 3};
a[1] = red;
危险!危险! red
是一个局部变量,在test()
返回后被销毁。不要存储指向函数返回后将使用的局部变量的指针。
你可以通过使其静态来解决这个问题,因为静态变量永远存在。
static double red[] = {1.1, 2, 3};
a[1] = red;
或者你可以动态分配内存:
double *red = new double[]{1.1, 2, 3};
a[1] = red;
答案 2 :(得分:4)
red
定义创建的数组是test
函数的本地数组。当函数结束时它将被销毁。您只是在map
中放置了指向其第一个元素的指针,但该函数返回后该指针不再指向有效数组。数组消失,指针悬空。
你可以动态分配数组,但这是一个巨大的痛苦,很可能导致内存泄漏和其他错误。
相反,我建议使用标准容器类型,例如std::vector
:
void test(map<int, std::vector<double>> &a)
{
a[1] = std::vector<double>{1.1, 2.0, 3.0};
}
答案 3 :(得分:3)
double red[] = {1.1, 2, 3};
具有自动存储持续时间。这意味着当函数返回时它不再有效。
你应该做这样的事情
void test(map<int, double*> &a)
{
double *red = new double[3];
// fill up red.
a[1] = red;
}