char *

2014-09-10 4 views
0

벡터를 만들려고하는데 아마도 벡터 내의 각 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* (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

왜'std :: string' 대신'char *'입니까? – clcto

+2

함수를 떠나는 순간 무효화되는 포인터를 저장하기 때문에 정의되지 않은 동작이 발생합니다. 왜 문자열을 벡터에 직접 저장하지 않습니까? – juanchopanza

+0

반대편의 인터페이스는 char *입니다. – Ono

답변

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>의 사용을 대신 고려한다 (당신이 절대적으로 char*에 충실해야하는 경우) 새 위치로 당신을 위해 C-문자열을 복사합니다 strdup를 사용합니다.

+0

우수! 감사!! – Ono

+0

나는 당신의 서비스 선생님입니다 – 4pie0

+0

죄송합니다, 나는 다른 대답을했지만, 나는 작동하고 upvoted 귀하의 솔루션을 시도했다. – Ono