反转动态分配数组的程序中的分段错误
Segmentation fault in a program that reverses a dynamically allocated array
我正在做一个测试,在线测试引擎显示分段错误,这令人困惑,因为没有进一步的细节,我检查了指针没有 NULL,它们工作得很好,但不知道如何 array 这里有效。因为在调试时,一切都很好,直到我尝试 cout/print 出数组。它报告说这里被压碎了。如果它坏了,我在这里什么也做不了,我点击 break 或 continue。如果我继续,它 运行 就好了。所以我真的很困惑。
我的电脑是windows7,我运行代码是visual studio2010 c++。
调试不是很清楚解决问题,而且我学c++效率不是很高。
用数组解决需要动态分配。
#include <cmath>
#include <cstdio>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
void reverseArray(int size, int num[]) {
if(size>1) {
int *p = &num[size-1];
int *f = num;
for(int i = 0;i < size/2; i++){
swap(*p, *f);
p--;
f++;
}
}
}
int main() {
int len;
int a[len];/This is the bug, can't use uninitialized var assign array/
cin >> len;
for(int i = 0; i < len; i++){
cin >> a[i];
}
reverseArray(len, a);
for(int i = 0; i < len; i++){
cout << a[i] << " ";
}
return 0;
}
这与动态分配有关,当我在 java 中工作时,我创建了一个新数组。
我必须
int[] newArray = {2,4,1,2,3};
或
int[] newArray = new int[] {2,4,1,2,3};
这个问题终于解决了,非常开心。
阅读和学习很重要,编码也很重要。
谢谢大家,
并使用 向量 而不是使用数组。
这会更容易。
#include <cstdio>
#include <vector>
#include <iostream>
using namespace std;
int main() {
int a;
int len;
vector<int> myvector;
cin >> len;
for(int i = 0; i < len; i++){
cin >> a;
myvector.push_back(a);
}
reverse(myvector.begin(), myvector.end());
for(int i = 0; i < len; i++){
cout << myvector[i] << " ";
}
return 0;
}
再次使用Array(我怀疑下面的代码):
#include<iostream>
//#include<cstdlib>
using namespace std;
void reverseArray(int size, int nums[]){
if(size > 1){
int *p = &nums[size-1];
int *q = nums;
for(int i = 0; i< size/2; i++){
swap(*p, *q);
p--;
q++;
}
}
}
int main(){
int len;
cin >> len;
int *a = new int[len];//a point to the first ele.
for(int i = 0; i< len; i++){
cin >> a[i];
}
reverseArray(len, a);
for(int i = 0; i < len; i++){
cout << a[i] << " ";
}
delete [] a;
return 0;
}
它在我的笔记本电脑上运行完美,这令人困惑,因为 a 是指针,但我像使用数组一样使用它。它不应该工作......
最终数组版本:
http://ideone.com/ZMsD35
完美完成。
#include<iostream>
using namespace std;
int main(){
int len;
cin >> len;
int *a = new int[len];
for(int i = 0; i< len; i++){
cin >> a[i];
}
reverse(a, a+len);
for(int i = 0; i< len; i++){
cout << a[i];
}
delete [] a;
system("pause");
return 0;
}
段错误最可能的原因是输入。当测试软件通过 len
大小足以溢出自动存储区时,您的程序在这一行崩溃:
int a[len];
len
的确切值取决于系统,但在大多数常见系统上输入 1,000,000 即可。
修复非常简单 - 将声明替换为
int a* = new int[len];
这会将数据放在动态内存中,而不是自动内存中。它还将使您的程序符合标准,因为 C++ 中的可变长度数组是对标准的扩展。
完成后不要忘记删除 a
以避免内存泄漏:
delete[] a;
我正在做一个测试,在线测试引擎显示分段错误,这令人困惑,因为没有进一步的细节,我检查了指针没有 NULL,它们工作得很好,但不知道如何 array 这里有效。因为在调试时,一切都很好,直到我尝试 cout/print 出数组。它报告说这里被压碎了。如果它坏了,我在这里什么也做不了,我点击 break 或 continue。如果我继续,它 运行 就好了。所以我真的很困惑。
我的电脑是windows7,我运行代码是visual studio2010 c++。 调试不是很清楚解决问题,而且我学c++效率不是很高。 用数组解决需要动态分配。
#include <cmath>
#include <cstdio>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
void reverseArray(int size, int num[]) {
if(size>1) {
int *p = &num[size-1];
int *f = num;
for(int i = 0;i < size/2; i++){
swap(*p, *f);
p--;
f++;
}
}
}
int main() {
int len;
int a[len];/This is the bug, can't use uninitialized var assign array/
cin >> len;
for(int i = 0; i < len; i++){
cin >> a[i];
}
reverseArray(len, a);
for(int i = 0; i < len; i++){
cout << a[i] << " ";
}
return 0;
}
这与动态分配有关,当我在 java 中工作时,我创建了一个新数组。 我必须
int[] newArray = {2,4,1,2,3};
或
int[] newArray = new int[] {2,4,1,2,3};
这个问题终于解决了,非常开心。 阅读和学习很重要,编码也很重要。 谢谢大家,
并使用 向量 而不是使用数组。 这会更容易。
#include <cstdio>
#include <vector>
#include <iostream>
using namespace std;
int main() {
int a;
int len;
vector<int> myvector;
cin >> len;
for(int i = 0; i < len; i++){
cin >> a;
myvector.push_back(a);
}
reverse(myvector.begin(), myvector.end());
for(int i = 0; i < len; i++){
cout << myvector[i] << " ";
}
return 0;
}
再次使用Array(我怀疑下面的代码):
#include<iostream>
//#include<cstdlib>
using namespace std;
void reverseArray(int size, int nums[]){
if(size > 1){
int *p = &nums[size-1];
int *q = nums;
for(int i = 0; i< size/2; i++){
swap(*p, *q);
p--;
q++;
}
}
}
int main(){
int len;
cin >> len;
int *a = new int[len];//a point to the first ele.
for(int i = 0; i< len; i++){
cin >> a[i];
}
reverseArray(len, a);
for(int i = 0; i < len; i++){
cout << a[i] << " ";
}
delete [] a;
return 0;
}
它在我的笔记本电脑上运行完美,这令人困惑,因为 a 是指针,但我像使用数组一样使用它。它不应该工作......
最终数组版本: http://ideone.com/ZMsD35 完美完成。
#include<iostream>
using namespace std;
int main(){
int len;
cin >> len;
int *a = new int[len];
for(int i = 0; i< len; i++){
cin >> a[i];
}
reverse(a, a+len);
for(int i = 0; i< len; i++){
cout << a[i];
}
delete [] a;
system("pause");
return 0;
}
段错误最可能的原因是输入。当测试软件通过 len
大小足以溢出自动存储区时,您的程序在这一行崩溃:
int a[len];
len
的确切值取决于系统,但在大多数常见系统上输入 1,000,000 即可。
修复非常简单 - 将声明替换为
int a* = new int[len];
这会将数据放在动态内存中,而不是自动内存中。它还将使您的程序符合标准,因为 C++ 中的可变长度数组是对标准的扩展。
完成后不要忘记删除 a
以避免内存泄漏:
delete[] a;