2012-06-22 2 views
2

저는 Linux를 사용하고 있습니다.strcat를 사용하여 메모리에 액세스 할 수 없습니다.

내가 좋아하는라는 기능이 있습니다

 
void SoundManager:: 
PlayBackgroundIntroMusic(char * musicFile) 
{ 
     // Concatenate extension for each platform 
     strcat (musicFile,audioExtension); 
     CCLOG("musicFile: %c" musicFile); 
    SimpleAudioEngine::sharedEngine()->playBackgroundMusic(std::string(CCFileUtils::fullPathFromRelativePath(musicFile)).c_str(), false); 
} 

하지만 난 라인 메모리에 나쁜 액세스 갖는 :

 
PlayBackgroundIntroMusic((char *)"IntroMusic"); 

기능입니다

 
strcat (musicFile,audioExtension); 

audioExtension가 declarated됩니다 :

,394,

그래서, 난이 예상 : 무슨 일이야

 
IntroMusic.caf on iOS 
IntroMusic.ogg on Android 

?

참고 : I가 시도 :

 
char * musicFileWithExtension = strcat (musicFile,audioExtension); 

하지만 어쨌든 작동하지 않았다.

musicFile은 상수가 아닙니다. 파일 이름이 너무 길면 오버플로를 피하기 위해 tempchar [80]을 선언하고 싶지 않습니다. Example cc reference

미리 감사드립니다.

+1

사용 그리고 그것을 종료를, 당신은 캐스트 아마 당신은 그것을 경청해야 추가 된 –

+1

캐스트없이 작동합니까? 연습 : 이유를 찾아보십시오. –

+0

(char *) 캐스트를 사용하면 경고가 전송되고 변환이 줄어들어 캐스트가 수행됩니다. – vgonisanz

답변

5

"IntroMusic"과 같은 문자열 리터럴은 const char *으로 암시 적으로 변환되는 const char[N] 유형입니다. 언어 디자인의 실수로 char*으로 변환 될 수도 있지만이 변환은 C++에서 올바르 게 사용되지 않으므로 경고합니다. 문자열 리터럴이 아닌 배열 (동적 또는 정적으로 할당 됨)을 사용해야합니다.

더 나아가 std::string을 사용하십시오.

1

strcat 설명서를보십시오. 소스 문자열에 대상 문자열을 추가하는 중입니다. 귀하의 경우 원본 문자열은 "musicFile"이므로 상수가 아니어야하며 길이가 충분해야합니다. 이런 기능이 호출되면

:

PlayBackgroundIntroMusic((char *)"IntroMusic"); 

다음 musicFile는 "IntroMusic를"== 상수이고 overwrited 수 없다.

2

우선 "IntroMusic"은 const입니다.

const 값에서 const-ness를 제거하고 수정하는 경우 은 정의되지 않은 동작입니다. 아무 일도 일어나지 않을 수 있습니다. 운이 좋으면 당장 추락 할 수 있습니다.

또한 "IntroMusic"에 할당 된 메모리는 문자의 경우 정확하게 정확히 10 바이트이며 경계 문자가 \0이므로 합계 11 바이트입니다. 기간. 이제 const 값을 강제로 수정하는 것 외에도 할당되지 않은 메모리에 쓰는 것조차합니다 (적어도 쓰기를 위해 할당하지 않은 메모리). 플랫폼 독립적 인 파일 확장명을 "IntroMusic"다음의 메모리.

귀하는 귀하의 작업에 충분히 큰 버퍼를 제공 할 책임이 있습니다.

간단한 솔루션

(당신이 질문 c++하지 c 태그 이후 :.. 당신의 컴파일러가 당신에게 무언가를 말하려고 std::string

관련 문제