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++ unsigned char 数组分配 - 分段错误

c++ 我想 concat char 但我得到一个分段错误

c++ 将 argv 读入 unsigned char 固定大小:分段错误

C++中char指针中的memset的分段错误(核心转储)[重复]

分段错误,怎么办? [关闭]

为啥这个看似简单的 C++ 代码会产生分段错误?