我正在使用 linux。
我有一个函数叫做:
PlayBackgroundIntroMusic((char *)"IntroMusic");
功能是:
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); }
但是我无法在线访问内存:
strcat (musicFile,audioExtension);
声明了音频扩展:
#include using std::string; #include using std::cout; using std::cerr; using std::endl; /** * Declare sound extension for each platform * Android = ogg * iOS = caf * WIN32 = mp3 */ #if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32) static const char * audioExtension = ".wav"; #elif (CC_TARGET_PLATFORM == CC_PLATFORM_IOS) static const char * audioExtension = ".caf"; #elif (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) static const char * audioExtension = ".ogg"; #endif
所以,我希望有:
IntroMusic.caf on iOS IntroMusic.ogg on Android
发生了什么事?
注意:我已经尝试:
char * musicFileWithExtension = strcat (musicFile,audioExtension);
但无论如何都没有用。
musicFile 不是常量。如果文件名太长,如 Example cc reference,我不想声明一个 tempchar[80] 以避免溢出。
提前致谢。
最佳答案
字符串文字,例如 "IntroMusic"
属于 const char[N]
类型,可以隐式转换为 const char *
。由于语言设计中的一个错误,它也可以转换为 char*
,但这种转换在 C++ 中是正确的,因此警告。您需要使用数组(动态或静态分配),而不是字符串文字。
或者更好的是,使用 std::string
。
关于c++ - 使用 strcat 对内存的错误访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11151626/