建立一个char *的向量

时间:2014-09-10 21:18:24

标签: c++ string pointers char

我正在尝试构建一个向量,并且据说向量中的每个char *都是不同的。这是代码:

static char *StatsManager::_statsOption[4] = {"min", "max", "mean", "stddev"};

void BuildStatsNameList(long ChanIdx)
{   
    for (int m = 0; m < 4; m++)
    {
        std::string statsName(StatsManager::_statsOption[m]);

        for (int n = 0; n < 1; n++)
        {
            statsName += "_";
            statsName += std::to_string(ChanIdx);
            statsName += "_";
            statsName += std::to_string(n);
            //sprintf (statsName, "s%_%d_%d", StatsManager::_statsOption[m],ChanIdx, n);
            StatsManager::_statsNameList.push_back((char*)statsName.c_str());
        }
    }
}

但是,我注意到char*中的statsNamestatsName)最终会变得相同。 例如,在循环之后,StatsManager::_statsNameList变为

stddev_1_0
stddev_1_0
stddev_1_0
stddev_1_0

...

相反,我希望它为

min_1_0
max_1_0
mean_1_0
stddev_1_0

任何人都知道如何避免statsName一次又一次被覆盖?感谢。

2 个答案:

答案 0 :(得分:4)

程序的行为未定义,因为您正在访问BuildStatsNameList函数中分配的内存指针,该函数在BuildStatsNameList返回给调用者后立即被释放。

void BuildStatsNameList(long ChanIdx)
{   
    for (int m = 0; m < 4; m++)
    {
        std::string statsName( ...option[m]);  // local variable
        _statsNameList.push_back( (char*)statsName.c_str()); // no problem so far
        }
    }
}

// but here _statsNameList holds pointers to invalid memory

请考虑使用std::vector< std::string>或使用strdup将{c}字符串复制到新位置(如果您必须坚持char*)。

答案 1 :(得分:3)

如果你想要持久的C风格字符串,一个选项就是使用strdup

   StatsManager::_statsNameList.push_back(strdup(statsName.c_str()));

但请注意,完成这些字符串后,您需要自己free内存。