【问题标题】:build a vector of char*建立一个 char* 的向量
【发布时间】:2014-09-10 21:18:24
【问题描述】:

我正在尝试构建一个向量,据说向量中的每个 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());
        }
    }
}

但是,我注意到 statsName 中的 char* (statsName ) 最终会变得相同。 例如在循环之后,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 一次又一次地被覆盖吗?谢谢。

【问题讨论】:

  • 为什么是char* 而不是std::string
  • 您有未定义的行为,因为您存储的指针会在您离开函数后立即失效。为什么不直接将字符串存储在向量中?
  • 对面的接口是char*。
  • @Ono The interface from the other side is char* 你知道 std::string 有一个 c_str() 成员函数,对吧?没有任何理由仅仅因为其他地方的实体使用 char* 就编写此代码。

标签: c++ string pointers char


【解决方案1】:

您的程序行为未定义,因为您正在访问在 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&lt; std::string&gt; 或使用strdup,它将为您复制c 字符串到新位置(如果您必须坚持使用char*)。

【讨论】:

  • 先生,我随时为您服务
  • 对不起,我接受了其他答案,但我尝试了您的解决方案,该解决方案有效并赞成。
【解决方案2】:

如果您想要持久的 C 样式字符串,一种选择是使用 strdup

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

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

【讨论】:

    猜你喜欢
    • 2018-06-06
    • 2021-05-28
    • 1970-01-01
    • 2014-02-08
    • 2023-03-05
    • 2016-08-18
    • 2011-02-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多