为什么strcat导致分段错误

时间:2018-02-01 01:51:22

标签: 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;
}

3 个答案:

答案 0 :(得分:11)

您有两个主要问题:

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

  2. 您调用strcat将所述131个字符附加到具有未定义内容的缓冲区(无NUL以指示串联的字符串的结束位置)。通过对所有buffchar buff[16384] = {0};)进行零初始化或在第一个字节中插入NUL(这是您真正需要的所有内容)添加{{1},这是可以轻松解决的。就在你buff[0] = '\0';之前。等效地,您可以将strcat(假设字符串连接目标中存在的新数据)替换为strcat(忽略目标的现有内容)以避免此问题。

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

答案 1 :(得分:3)

"properties": { "type": {"enum": ["a", "b", "c"]}, "args": { "type": "object", "properties": { "propA1": {"type":"string" }, "propA2": {"type":"string" }, "propB1": {"type":"string" }, "propC1": {"type":"string" }, "propC2": {"type":"string" }, "c1": {"type":"string" }, "c2": {"type":"string" }, "c3": {"type":"string" } } "required": ["c1", "c2", "c3"] } "anyOf": [{ "properties": { "type": {"enum": ["a"]}, "args": { "required": ["propA1", "propA2"] } } }, { "properties": { "type": {"enum": ["b"]}, "args": { "required": ["propB1"] } } }, { "properties": { "type": {"enum": ["c"]}, "args": { "required": ["propC1", "propC2"] } } }] }, "required": ["type", "args"] 未初始化。它需要包含空终止字符串,以便buff知道从何处开始连接。一种方法是使用strcat

strcpy

答案 2 :(得分:1)

strcat需要'dest'成为以'\ 0'结尾的字符串。所以buff应该手动初始化。