这里分割故障的原因是什么?
What is cause of segmentation fault here?
我写了一个小数组合并程序。在运行中,我得到分割错误。谁能告诉我哪里出了问题?
#include <iostream>
using namespace std;
void merge(int arr[], int p, int q, int r)
{
int L[q-p+1];
int R[r-q];
for(int i = p; i < r;i++)
{
if(i<q+1)
{
L[i] = arr[i];
}
else
{
R[i-q+1] = arr[i];
}
}
int i = 0, j = 0,k = p;
while(i<q-p+1 || j<r-q)
{
if(L[i]>R[j])
{
arr[k] = R[j];
j++;
}
else
{
arr[k] = L[i];
i++;
}
k++;
}
if(i == q-p+1)
{
for(;j<r-q;j++,k++)
{
arr[k] = R[j];
}
}
if(j == r-q)
{
for(;i<q-p+1;i++,k++)
{
arr[k] = L[i];
}
}
}
int main()
{
cout << "Hello world!" << endl;
int a[] = {2,4,6,8,1,3,5,9};
merge(a,0,3,7);
for(int i = 0; i<8;i++)
{
cout<<a[i]<<"t";
}
return 0;
}
您应该在调试器中逐步执行。
这行代码:
while (i<q - p + 1 || j<r - q)
不会阻止i>= q-p+1
(即如果j仍然小于r-q
)。这将意味着您正在读取数组边界之外的内容。
应该改成
while (i<q - p + 1 && j<r - q)
还注意:int L[q-p+1]
不是有效的c++,它是有效的C,但不是c++
相关文章:
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- C++避免重复声明的语法是什么
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- C++从另一个类访问公共静态向量的正确方法是什么
- "throw expression code" 1e7 >返回 d 是什么?投掷标准::overflow_error( "too big" ) : d;意味 着?
- C++中名称篡改的目的是什么
- 在 c++ 中拥有一组结构的正确方法是什么?
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值
- 是什么阻止DOMTimerCoordinator::NextID进入无休止的循环
- 派生类销毁的最佳实践是什么
- 这个语法std::class<>{}(arg1, arg2) 在C++中是什么意思?
- 通过JNI传递数据数组的最快方法是什么
- "using namespace std;"在C++的作用是什么?
- 在两台机器之间进行时间戳的最佳c++chrono函数是什么
- 文件系统:复制功能的速度秘诀是什么
- 用常见虚拟函数实现的任意组合来实现派生类的正确方法是什么
- 使用QQuickFramebufferObject时同步数据的最佳方式是什么
- 这里分割故障的原因是什么?
- 这种分割故障的根源是什么?