【发布时间】:2014-02-01 20:00:05
【问题描述】:
以下用 C++ 编写的合并排序程序在通过控制台提供输入时可以正常工作。但是当我使用文本文件提供输入时,它会给我一个分段错误。我尝试在代码的各个部分打印消息以检查错误在哪里,但除了 d seg-fault 消息之外,它没有打印任何内容。 这是代码。当我不使用文件提供输入/显示输出时,它工作正常。
我在一个基本内存为 1 GB 的 virtualbox 4.0.8(ubuntu OS) 中的 gcc 编译器上运行了这个 prog。 cud错误是由于内存不足引起的?
#include<iostream>
#include<fstream>
#include<sys/time.h>
using namespace std;
int array[50];
int barray[50];
void merge(int p,int q, int r)
{
int i,j,k,l;
l=p;
i=p;
j=q+1;
while((i<=q)&&(j<=r))
{
if(array[i]<=array[j])
barray[++k]=array[i++];
else
barray[k++]=array[j++];
}
if(i>q)
{
for(l=j;l<=r;l++)
{
barray[k]=array[l];
k++;
}
}
else
{
for(l=i;l<=q;l++)
{
barray[k]=array[l];
k++;
}
}
for(i=p;i<=r;i++)
array[i]=barray[i];
}
void mergesort(int p, int r)
{
int q;
if(p<r)
q=(p+r)/2;
mergesort(p,q);
mergesort(q+1,r);
merge(p,q,r);
}
int main()
{
int r, p, i;
struct timeval tv1, tv2;/* For finding the running time */
gettimeofday(&tv1, NULL);
ifstream fin;
ofstream fout;
fin.open("abc5.txt");
fout.open("new5.txt");
fin>>r;
while(fin)
{
for(i=1;i<=r;++i)
{
fin>>array[i];
}
}
mergesort(1,r);
for(i=1;i<=r;++i)
{
fout<<array[i]<<"\n";
}
gettimeofday(&tv2, NULL);
fout<<"Running Time: "<<(double) (tv2.tv_usec - tv1.tv_usec) / 1000000 + (double) (tv2.tv_sec - tv1.tv_sec)<<" sec";
fin.close();
fout.close();
return 0;
}
输入文件 8 3 6 2 8 9 1 4 10
【问题讨论】:
-
也可以发布输入文件,因为它最好不要超过 50 行。如果是这样,再加上 C/C++ 数组基于 1 和 0 的不正确使用,很容易调用 UB。
-
注意:在将
k用作合并算法中取消引用的索引之前,您永远不会初始化它。仅此一项就会调用未定义的行为。另外,检查两个主要任务中k的增量。它并不一致,它需要是。老实说,合并算法只需要彻底改造。 -
对不起,得吃午饭了。此外,如果
(p<r)曾经是false,则q可以在您的mergsesort算法中未初始化;还有更多未定义的行为。正如我所说,这需要返工并更好地理解未定义的行为和基于 0 的数组。将同一拆分数组中的两个段合并到临时存储中,然后复制回原始存储的算法在某种程度上对于合并排序算法至关重要。所说的合并算法需要solid。
标签: c++ segmentation-fault mergesort