Aborted (Zrzut pamięci) - o co chodzi?

Aborted (Zrzut pamięci) - o co chodzi?
S1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 20
0

Cześć.
Mam pewien problem z alokacją pamięci. Staram się rozwiązać SPOJowe zadanie:
http://pl.spoj.com/problems/PP0502B/
i niestety program nie działa. Wklejam kod(opis problemu pod spodem):

Kopiuj
#include <iostream>
#include <stdio.h>
#include <stdlib.h>

using namespace std;

int main(){
    int rozmiar = 0, testy = 0;
    cin>>testy;
    int *tablica;
    while(testy){

        cin>>rozmiar;
        tablica=(int *)malloc(sizeof(int)*rozmiar);
        for(int i = 0; i<rozmiar; i++){
            cin>>*tablica;
            tablica++;
        }
        tablica--;
        for(int i =rozmiar-1;i>=0; i--){
            printf("%d ", *tablica);
            tablica--;
        }

        
        cout<<endl;
        testy--;
        free(tablica);
    }

    return 0;
}

Dla ilości testów >5 następuje zrzut pamięci w trakcie wykonywania programu. Wersja kompilatora - 4.9.2, wszystko pod cygwinem. Kod chyba jest dość jasny.
Znalazłem rozwiązanie zadania na forum(bazujące na rekurencji), ale chciałbym zrobić to tą metodą. Na stacku jest trochę o tym, ale problemy z pamięcią są mocno... indywidualne? Poza tym często kawałki kodu są dość pokaźne i zaawansowane - trudno się w nich połapać laikowi.
Ma ktoś jakiś pomysł? Byłbym bardzo wdzięczny za pomoc.

Shalom
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Space: the final frontier
  • Postów: 26433
2

Nieczytelność level over 9000. Serio musisz te pętle pisać w tak chory sposób? Nie da sie po ludzku nie ruszać tego wskaźnika tylko robić tablica[i]? Bo błąd polega właśnie na tym że przesuwasz wskaźnik tablica na pozycje -1 a potem robisz free ;]

katelx
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Hong Kong
0

po co w ogole dynamicznie alokujesz pamiec, nie lepiej po prostu zrobic

Kopiuj
int rozmiar = 0, testy = 0, tablica[100];

i zapomniec o wskaznikach?
na dodatek niepotrzebnie mieszasz c++ i c, spoj czasem ma na to alergie :)

S1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 20
0

@Shalom, czytałem wcześniej parę tematów na forum i, szczerze mówiąc, liczyłem na Ciebie. Oczywiście masz rację, dzięki. SPOJ nawet nie miaukął.
Poniżej wklejam poprawny kod, może przyda się potomnym:

Kopiuj
#include <iostream>
#include <stdio.h>
#include <stdlib.h>

using namespace std;

int main(){
    int rozmiar = 0, testy = 0;
    cin>>testy;
    int *tablica;
    while(testy){
        cin>>rozmiar;

        tablica=(int *)malloc(sizeof(int)*rozmiar);

        for(int i = 0; i<rozmiar; i++){
            cin>>tablica[i];
        }

        for(int i =rozmiar-1;i>=0; i--){
            printf("%d ", tablica[i]);
        }
        cout<<endl;
        testy--;
        free(tablica);
    }
    return 0;
}

Propsy za DBZ.

@katelx lubię wskaźniki. I chyba to jest ten sam rodzaj chorej sympatii jak ta, którą darzę np. vima.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.