为什么 strcat 会导致分段错误
Why strcat causing 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;
}
您有两个主要问题:
-
您的
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应该手动初始化。
相关文章:
- 在某些循环内使用vector.push_back时出现分段错误
- 为什么在运行时没有向我们提供有关分段错误的更多信息?
- 如何解决gcc编译器优化导致的centos双编译器设置中的分段错误
- 当我的阵列太大时出现分段错误
- 分段错误当我试图运行程序时出错
- 在c++中初始化矩阵时出现分段错误(核心转储)
- 尝试使用集合函数时出现分段错误
- 我无法缩小此分段错误的原因
- g++的分段错误(在NaN上使用to_string两次时)
- 我是如何在这段代码中出现分段错误的
- 创建结构的数组时遇到分段错误
- 在c++中键入向量中的所有值后,得到分段错误(核心转储)
- 在 c++ 中实现 Trie 时出现分段错误
- 为什么 fstream 在打开带有格式的文件时会导致分段错误?
- 为什么我遇到分段错误?
- 动态类的分段错误(家庭作业问题)
- 分段错误 - 读取初始化指针的数组
- 如何摆脱C ++中的分段错误错误?
- 使用 CTYPE 时出现分段错误
- 为什么代码给出分段错误?