为什么 strcat 会导致分段错误

Why strcat causing segmentation fault

本文关键字:分段 错误 strcat 为什么      更新时间:2023-10-16

谁能向我解释为什么下面的代码会导致分段错误? 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;
}

您有两个主要问题:

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

  2. 您调用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应该手动初始化。