我刚刚制作了一个用于反转阵列的程序,我在一个在线网站上提交了它,它通过了大部分测试用例,但显示了一个" Segmentation Fault"。在google上阅读它之后我实现了它在以下情况下通常会发生: -
所以我认为我有一些结束数组的错误
我的代码
#include<bits/stdc++.h>
#include<stdlib.h>
using namespace std;
int main()
{
int i,n,j,temp=0;
int arr[20];
cin>>n;
for(i=0;i<n;i++)
{
cin>>arr[i];
}
j=i-1;
i=0;
while(i<j)
{
temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
i++;
j--;
}
for(i=0; i<n; i++)
{
cout<<arr[i]<<" ";
}
}
测试用例 输入 100 242 491 9227 3742 2430 6533 1797 717 9052 9638 3360 8260 7478 9775 3062 295 818 8073 1030 1846 9550 3622 3534 8920 3714 6532 5155 848 51 1579 9413 7049 1948 9388 7358 7819 7956 7826 7089 1877 5628 8738 8604 3538 7328 8652 536 4135 1171 8281 9990 8064 389 796 4529 3576 3694 6979 4784 7359 4210 8853 6866 3283 3564 5204 1201 4954 7124 6426 258 1268 9915 8877 4049 8443 6236 1900 9975 3043 5403 3025 9509 1324 5991 6478 3624 7949 7208 7730 2885 4072 899 1107 5355 5547 1139 5907 4134 9642
预期产出 9642 4134 5907 1139 5547 5355 1107 7208 7949 3624 6478 5991 1324 9509 3025 5403 3043 9975 1900 6236 8443 4049 8877 9915 1268 258 6426 7124 4954 1201 5204 3564 3283 6866 8853 4210 7359 4784 6979 3694 3576 4529 796 389 8064 9990 8281 1171 4135 536 8652 7328 3538 8604 8738 5628 1877 7089 7826 7956 7819 7358 9388 1948 7049 9413 1579 51 848 5155 6532 3714 8920 3534 3622 9550 1846 1030 8073 818 295 3062 9775 7478 8260 3360 9638 9052 717 1797 6533 2430 3742 9227 491 242
答案 0 :(得分:3)
包含值的数组不够大。结果,你最终写过数组的末尾。这会调用undefined beahvior,在这种情况下会显示为崩溃。
您需要为值的数量分配足够大的空间:
cin>>n;
int *arr = new int[n];
在程序结束时不要忘记delete[] arr;
。
编辑:
如果你想用“适当的”C ++方式,你可以使用std::vector
:
cin>>n;
std::vector<int> arr(n);
这样您就不必担心以后释放内存了。当arr
超出范围时,它会自动发生。