谁能向我解释为什么下面的代码会导致分段错误? 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;
}
您有两个主要问题:
-
您的
sprintf
将 131 字节(130 个字符加一个NUL
)塞入 128 字节的缓冲区,这意味着三个不相关的堆栈字节被垃圾覆盖。您需要更大的缓冲区或更小的初始化字符串。 -
您调用
strcat
将上述 131 个字符附加到具有未定义内容的缓冲区(没有NUL
指示要连接的字符串结束的位置)。这是很容易解决的,通过零初始化所有buff
(char buff[16384] = {0};
)或通过在第一个字节中插入NUL
(这是您真正需要的)在strcat
之前添加buff[0] = ' ';
。等效地,您可以将strcat
(假设一个字符串来连接目标中存在的新数据)替换为strcpy
(忽略目标的现有内容)以避免此问题。
基本上,您的代码充满了未定义的行为和缓冲区溢出。鉴于您使用的是C++,我可以建议只使用std::string
来避免 C 字符串的麻烦吗?
buff
未初始化。它需要包含一个以 null 结尾的字符串,以便strcat
知道从哪里开始串联。一种方法是使用strcpy
:
strcpy(buff, ""); // initialize with empty null terminated string
strcat(buff, buff2); // add to it
strcat 需要 'dest' 是一个以 '\0' 结尾的字符串。所以buff应该手动初始化。