2016-11-27 2 views
-2

Я делал тест, и онлайновый тестовый движок показывал ошибку сегментации, что сбивает с толку, потому что без дальнейших подробностей я проверил указатель 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; 

} 
+1

Комментарии не для широкого обсуждения; этот разговор был [перемещен в чат] (http://chat.stackoverflow.com/rooms/129268/discussion-on-question-by-r-mia-segmentation-fault-in-a-program-that-reverses- а). –

ответ

0

Наиболее вероятной причиной для segfault является ввод. Когда тестирование программного обеспечение проходит len размера, достаточного для переполнения автоматической области памяти, программа выходит из строя по этой линии:

int a[len]; 

Точное значение len зависит от системы, но вход 1,000,000 должен сделать это наиболее общие системы.

Исправление действительно проста - заменить декларацию с

int a* = new int[len]; 

Это поместит данные в динамической памяти, а не автоматической памяти. Это также сделает вашу программу стандартной, поскольку массивы переменной длины на C++ являются расширением стандартов.

Не забудьте удалить a как только вы сделали, чтобы избежать утечки памяти:

delete[] a; 
+0

Привет, спасибо большое! Теперь я работаю, могу ли я узнать разницу между двумя ключевыми строками? Нужно ли удалять каждый указатель? – flowera

+0

@ R.mia Это изменяет размещение ваших данных из автоматической памяти (стека) в динамическую память (кучу). – dasblinkenlight

+0

Могу ли я узнать, что связано с документом или ссылкой, которую я могу назвать/ – flowera

Смежные вопросы