построить вектор символа *

0

Я пытаюсь построить вектор, и, предположительно, каждый символ * внутри вектора отличается. Вот код:

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* (statsName) в 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 снова и снова? Благодарю.

  • 1
    Почему char* вместо std::string ?
  • 2
    У вас неопределенное поведение, потому что вы храните указатели, которые становятся недействительными, как только вы выходите из функции. Почему бы не хранить строки в векторе напрямую?
Показать ещё 2 комментария
Теги:
string
pointers
char

2 ответа

3
Лучший ответ

Если вы хотите, чтобы строки стиля C сохранялись, одним из вариантов является использование strdup.

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

Обратите внимание, однако, что вам нужно free память самостоятельно после того, как вы закончите с этими строками.

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*).

  • 0
    Отлично! Спасибо!!
  • 0
    Я к вашим услугам, сэр
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню