为什么strcat导致分段错误

gji*_*138 -4 c++ segmentation-fault

任何人都可以向我解释为什么以下代码导致分段错误?buff应足够长,可容纳128个字符.

int main () {
    char buff[16384];
    char buff2[128];
    sprintf(buff2, "MinPer(PatternName_Equal27_xxxxxxx_MasterPatSetup.PatternName_Equal27_xxxxxxx__default_WFT___WFTRef.ActualT0Period.UserPeriod_2_1)" );
    strcat(buff, buff2);
    std::cout << buff2 << endl;
    std::cout << buff << endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

Sha*_*ger 11

你有两个主要问题:

  1. sprintf将131字节(130个字符加上a NUL)推入128字节缓冲区,这意味着三个不相关的堆栈字节被垃圾覆盖.您需要更大的缓冲区或更小的初始化字符串.

  2. 您调用strcat将所述131个字符追加到具有未定义内容的缓冲区(不NUL指示串联的字符串的结束位置).这可以通过零初始化所有buff(char buff[16384] = {0};)或通过插入NUL第一个字节(这是你真正需要的)buff[0] = '\0';在你之前添加来简单地修复strcat.等效地,您可以替换strcat(假定用于将新数据连接到目标中的字符串)strcpy(忽略目标的现有内容)以避免此问题.

基本上,您的代码充满了未定义的行为和缓冲区溢出.鉴于您使用的是C++,我是否可以建议使用std::string以避免C字符串的麻烦?