0

我想通过引用函数来传递地图。这是代码:

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;
}

问题是,a[1][1] 应该是 2。但是,当我执行程序时,它会给出一个大数字,例如 1.73e120 !!!

4

4 回答 4

4

您的地图将整数映射到指向双精度的指针。当您在函数中添加元素时,就像您在此处所做的那样,

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.};
}
于 2013-04-18T13:39:44.267 回答
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;
于 2013-04-18T13:40:25.743 回答
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};
}
于 2013-04-18T13:41:09.207 回答
3
double red[] = {1.1, 2, 3}; 

具有自动存储期限。这意味着当函数返回时它不再有效。

你应该做这样的事情

void test(map<int, double*> &a)
{
    double *red = new double[3];
    // fill up red.
    a[1] = red;
}
于 2013-04-18T13:39:40.313 回答