任何人都可以向我解释为什么以下代码导致分段错误? 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;
}
答案 0 :(得分:11)
您有两个主要问题:
您的sprintf
将131字节(130个字符加NUL
)推入128字节缓冲区,这意味着三个不相关的堆栈字节被垃圾覆盖。您需要更大的缓冲区或更小的初始化字符串。
您调用strcat
将所述131个字符附加到具有未定义内容的缓冲区(无NUL
以指示串联的字符串的结束位置)。通过对所有buff
(char buff[16384] = {0};
)进行零初始化或在第一个字节中插入NUL
(这是您真正需要的所有内容)添加{{1},这是可以轻松解决的。就在你buff[0] = '\0';
之前。等效地,您可以将strcat
(假设字符串连接目标中存在的新数据)替换为strcat
(忽略目标的现有内容)以避免此问题。
基本上,您的代码充满了未定义的行为和缓冲区溢出。鉴于您正在使用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应该手动初始化。