Я делал тест, и онлайновый тестовый движок показывал ошибку сегментации, что сбивает с толку, потому что без дальнейших подробностей я проверил указатель no NULL, и они работают очень хорошо, но не так, как массив здесь работает. Потому что при отладке все в порядке, пока я не попытаюсь отключить/распечатать массив. он сообщает, что здесь раздавлен и ломается. Я ничего не могу здесь сделать, если он сломается, и я ударил перерыв или продолжил. если я продолжу, все будет отлично. поэтому я был очень смущен.Ошибка сегментации в программе, которая меняет динамически выделенный массив
Мой компьютер - это Windows 7, я запускаю код в visual studio 2010 C++. Отладка не так понятна, чтобы решить проблему, и я изучаю C++ не очень эффективно. Решите с Array необходимо динамическое распределение.
#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};
Наконец, эта проблема решена, что делает меня очень счастливым. Чтение и обучение очень важны, кодирование также важно. Спасибо,
И используя vector вместо использования массива. Было бы проще.
#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;
}
Использование массива снова (я сомневаюсь, следующий код):
#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;
}
Он работал отлично на моем ноутбуке, который сбивает с толку, потому что это указатель, но я использую его как массив. Он не должен работать ...
Окончательный вариант массива: 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;
}
Комментарии не для широкого обсуждения; этот разговор был [перемещен в чат] (http://chat.stackoverflow.com/rooms/129268/discussion-on-question-by-r-mia-segmentation-fault-in-a-program-that-reverses- а). –