【发布时间】:2015-03-29 01:56:36
【问题描述】:
当我在循环中将每个元素设置为 0 或 entry_count-1 时,它会起作用。 当我设置它时它可以工作,以便 entry_count 很小,我用手而不是循环编写它(sorted_order[0] = 0; sorted_order[1] = 1; ...等)。
请不要告诉我如何修复我的代码。出于非常具体的原因,我不会使用智能指针或向量。而是专注于这个问题: 什么样的条件会导致这种段错误? 谢谢。
---- 旧 -----
我正在尝试调试无法在 unix 机器上运行的代码。代码的要点是:
int *sorted_array = (int*)memory;
// I know that this block is large enough
// It is allocated by malloc earlier
for (int i = 0; i < entry_count; ++i){
sorted_array[i] = i;
}
循环中的某处似乎存在段错误。不幸的是,切换到调试模式会使段错误停止。使用cout调试发现一定是在循环中。
接下来我想知道段错误在循环中发生了多远,所以我添加了:
std::cout << i << '\n';
它显示了它应该循环的整个范围,并且没有段错误。
经过更多的实验,我最终在循环之前创建了一个字符串流,并为循环的每次迭代写入一个空字符串,并且没有段错误。
我尝试了一些其他各种操作,试图弄清楚发生了什么。我尝试设置一个变量 j = i;和类似的东西,但我还没有找到任何有用的东西。
运行 valgrind 我得到的关于 segfault 的唯一信息是它是“一般保护错误”以及对 11 的默认响应。它还提到有条件跳转或移动取决于未初始化的值,但是查看代码我无法弄清楚这是怎么可能的。
这可能是什么?我没有想法去探索。
【问题讨论】:
-
调试器告诉你什么?你怎么知道块足够大?它是如何分配的?从那时起
entry_count会发生变化吗?你为什么不使用std::vector? -
我们需要查看更多代码。假设
int* memory = new int[entry_count],那么一切都应该没问题。或者,在 gdb 中加载core文件并向我们展示where和bt full的输出。最后,您应该使用new或更好的std::vector。 -
如果您对
memory的假设是正确的,那么您提供的代码中的任何内容都不应出现段错误。我建议使用std::vector,它将在良好的调试编译器上进行边界检查,并可能立即显示您的问题。 -
@MikeSeymour 有没有理由使用原始指针来存储数组?
-
@Golazo 不,因为 C++ 和 C 是不同的语言,这个问题是关于 C++ 的。
标签: c++ segmentation-fault iostream