C++ char*[255] 产生分段错误 [关闭]
Posted
技术标签:
【中文标题】C++ char*[255] 产生分段错误 [关闭]【英文标题】:C++ char*[255] producing segmentation fault [closed] 【发布时间】:2016-07-20 16:42:44 【问题描述】:我知道这可能是已经讨论过 1000 次的基本问题,但我认为我需要帮助理解为什么以下会产生分段错误:
char* outputPath = new char[255];
sprintf(outputPath, "/home/istrab/iStrabGUI Output/%s/%s/0/Frames",patientName, techName);
我想知道这是因为经过一些研究后,我已将数组的大小声明为 255,我知道它足以容纳我希望写入的字符串。我还确保它在尝试写入之前已初始化。我还双重确保任何涉及的变量都在代码中较早地初始化,否则程序将在那时退出。我还有其他方法可以解决这个问题吗?它是在字符串本身还是我初始化数组的方式?
此代码是使用 C++ 中的 Qt 4.8.6 编写的
【问题讨论】:
为什么不使用字符串对象而不是字符数组呢?可以省去很多麻烦。char outputPath[255]
会更符合 IMO 的习惯。还有你应该使用的最大路径长度的常量/定义(如果没有别的,为了便携性)
这应该是 C++ 吧? std::ostringstream strm; strm << "/home/istrab/iStrabGUI Output/" << patientName << '/' << techName << "/0/Frames"; std::string outputPath = strm.str();
-- 即使 techname 或 patientName 失控并且比预期的大,代码仍然有效。
我想知道这是因为经过一些研究我已经声明数组的大小为 255, -- 不要用这种思维方式编写程序,特别是不要写那些你无法确保这些前提条件成立的地方。
请提供MCVE。另外,你不应该使用sprintf
,而是使用snprintf
(虽然你应该只使用std::string
,但也许你有你的限制)。
【参考方案1】:
如果您仍然使用 Qt,请使用 QString
:
QString outputPath;
outputPath.sprintf( "/home/istrab/iStrabGUI Output/%s/%s/0/Frames",
patientName,
techName);
【讨论】:
谢谢。这个方法我试过了,问题解决了。【参考方案2】:在其上运行 gdb 并在该行上打断,然后打印 patientName 和 techName 的值。两者之一可能为空。
【讨论】:
我知道它们不是,因为我使用打印命令在到达违规行之前打印它们。【参考方案3】:您可以使用QDir
方法。
QDir path("/home/istrab/iStrabGUI Output/");
path.cd(patientName);
path.cd(techName);
path.cd("/0/Frames");
QString pathString = path.path();
【讨论】:
【参考方案4】:vars patientName, techName 是问题,你应该使用 resize outputPath 变大,不会溢出。
但我试图找出使用字符串库中的字符串 var。 Look here
【讨论】:
以上是关于C++ char*[255] 产生分段错误 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章
c++ 将 argv 读入 unsigned char 固定大小:分段错误