c++ - 使用 strcat 对内存的错误访问

标签 c++ std string-concatenation cocos2d-x

我正在使用 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/

相关文章:

c++ - 提取模板类默认参数

c++ - 为什么在 Windows/unix/linux 中使用管道被认为是危险的?

c++ - clang++ 中的 std::underlying_type 支持

C++ std::cin 未处理的异常:访问冲突写入位置

c++ - stdlib.h 中的 rand 有多糟糕?

c# - 用中间的文本格式化 DateTime

c - 了解 C 字符串连接

c++ - CMAKE:重复调用具有不同参数的函数会产生相同的结果

c++ - 无法使用在不同头文件中定义的结构

vba - 将字符串和数字连接为数字