我刚刚制作了一个用于反转数组的程序,我正在一个在线网站上提交它,它通过了大多数测试用例,但显示"分段错误"。在谷歌上阅读后,我意识到它通常在以下情况下发生:-
- 取消引用空
- 取消引用未初始化的指针
- 取消引用已释放或超出范围的指针
- 注销数组的末尾
所以我认为我在结束数组时有一些错误
我的代码
#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 40498443 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 899 4072 2885 7730 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保存值的数组不够大。 结果,您最终会写入数组的末尾。 这将调用未定义的beahvior,在这种情况下表现为崩溃。
您需要为值的数量分配足够大的空间:
cin>>n;
int *arr = new int[n];
不要忘记在程序结束时delete[] arr;
。
编辑:
如果你想以"正确"C++的方式做到这一点,你可以改用一个std::vector
:
cin>>n;
std::vector<int> arr(n);
这样,您无需担心以后释放内存。 当arr
超出范围时,它将自动发生。