• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

stos dynamiczny. problem z pamięcią.

Object Storage Arubacloud
0 głosów
612 wizyt
pytanie zadane 25 października 2015 w C i C++ przez Mateep Użytkownik (850 p.)

Witam napisałem stos dynamiczny który zwiększa rozmiar jak dodajemy elementy ale przy 10 elemencie wywala błąd.

Error in `./stack': realloc(): invalid next size: 0x000000000217a010

oto i kod

//STOS

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

int size;
int* stos;
int top;

void pop();
void push();
void stos_size();
void empty();
void stos_print();


int main()
{
    
    top=0;
	size=0;
	int w;

do{
        stos_print();
    printf("\n\nMENU GLOWNE:\n");
    printf("1.Push\n");
    printf("2.Pop\n");
    printf("3.Size\n");
    printf("4.Empty\n");
    printf("5.koniec progamu\n");
    printf("/////////////////////////\n");
    printf("\nwybor:");
    scanf("%d",&w);
    switch(w)
    {
        case 1:
            push();
            break;
        case 2:
            pop();
            break;
        case 3:
            stos_size();
            break;
        case 4:
            empty();
            break;

    }
}while(w!=5);

    return 0;
}

void stos_print()
{

int i;
    
    printf("\n\nzawartosc stosu:\n");
    for(i=top;i>=1;i--)
    {
        printf("%d\n",stos[i]);
    }
    if(top==0)printf("pusty\n");
        printf("===============\n");
}
void push()
{
    int a;
    if(top>=size)
    {
     
	
		int nsize=size+5;
		int* nstos=(int*)realloc(stos,nsize*sizeof(int));
		size=nsize;
		if(nstos)
			stos=nstos;
		else
		{
			printf("blad");
			free(stos);
		}
	}
	printf("Podaj liczbe do polozenia na stosie:");
	top++;
	scanf("%d",&a);
	stos[top]=a;	
	
		
    
}

void pop()
{
    if(top>=1)
    {
        printf("usunieto ze stosu liczbe:%d",stos[top]);
        
        top=top-1;
    }
    else
    {
        printf("stos pusty!");
    }
}

void stos_size()
{
    printf("liczba elementow na stosie:%d",top);
}

void empty()
{
    if(top==0)
    printf("Stos pusty");
    else printf("stos nie jest pusty");
}

 

2 odpowiedzi

+2 głosów
odpowiedź 25 października 2015 przez Radfler VIP (101,030 p.)
wybrane 26 października 2015 przez Mateep
 
Najlepsza

Dobra znalazłem błąd, a właściwie 4:

1. Na początku main'a do zmiennej stos powienieneś przypisać NULL, w przeciwnym razie realloc może mieć problemy,

2. W funkcji push zmienna top powinna być inkrementowana po dodaniu liczby nie przed,

3. W funkcji stos_print pętla powinna wyglądać trochę inaczej:

for(i = top - 1; i >= 0; --i) {
  printf("%d\n",stos[i]);
}

4. W funkcji pop drukowanie zdjętej liczby powinno wyglądać tak:

printf("usunieto ze stosu liczbe:%d", stos[top - 1]);

5. Pełny kod (działający u mnie):

//STOS

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

// Mój dodatek
#include <time.h>

int size;
int* stos;
int top;

void pop();
void push();
void stos_size();
void empty();
void stos_print();


int main()
{

    top=0;
    size=0;
    stos = NULL;
    int w;

do{
        stos_print();
    printf("\n\nMENU GLOWNE:\n");
    printf("1.Push\n");
    printf("2.Pop\n");
    printf("3.Size\n");
    printf("4.Empty\n");
    printf("5.koniec progamu\n");
    printf("/////////////////////////\n");
    printf("\nwybor:");
    scanf("%d",&w);
    switch(w)
    {
        case 1:
            push();
            break;
        case 2:
            pop();
            break;
        case 3:
            stos_size();
            break;
        case 4:
            empty();
            break;

    }
    // Mój dodatek: uśpienie i czyszczenie ekranu
    clock_t now = clock();
    while(512 > clock() - now);
    system("cls");
}while(w!=5);

    return 0;
}

void stos_print()
{

int i;

    printf("\n\nzawartosc stosu:\n");
    for(i = top - 1;i >= 0;i--)
    {
        printf("%d\n",stos[i]);
    }
    if(top==0)printf("pusty\n");
        printf("===============\n");
}
void push()
{
    int a;
    if(top == size)
    {


        int nsize=size+5;
        int* nstos=(int*)realloc(stos,nsize*sizeof(int));
        size=nsize;
        if(nstos)
            stos=nstos;
        else
        {
            printf("blad");
            free(stos);
        }
    }
    printf("Podaj liczbe do polozenia na stosie:");

    scanf("%d",&a);
    stos[top]=a;

top++;

}

void pop()
{
    if(top>=1)
    {
        printf("usunieto ze stosu liczbe:%d",stos[top - 1]);

        top=top-1;
    }
    else
    {
        printf("stos pusty!");
    }
}

void stos_size()
{
    printf("liczba elementow na stosie:%d",top);
}

void empty()
{
    if(top==0)
    printf("Stos pusty");
    else printf("stos nie jest pusty");
}

Pozdrawiam! :)

0 głosów
odpowiedź 25 października 2015 przez Mateep Użytkownik (850 p.)
dzięki wielkie!!!
komentarz 25 października 2015 przez Radfler VIP (101,030 p.)
Nie ma za co! :)

Zawsze możesz nacisnąć przycisk "Najlepsza odpowiedź"!

Pozdrawiam! :D
komentarz 29 października 2015 przez Mateep Użytkownik (850 p.)
a jakbym chciał zrobić to w c++ to generalnie wiem jak pozmieniać ale jak realloca w c++?
komentarz 29 października 2015 przez Radfler VIP (101,030 p.)

No cóż w nie ma (niestety) realloca dla operatora new[] (dla new z resztą też nie ma), więc sam musiałbyś coś napisać. Mogę Cię naprowadzić. Zrób mniej więcej taką funkcję:

int* reallocArray(int* oldArray, std::size_t oldArraySize, std::size_t newArraySize);

Zaalokowałbyś w niej nową tablicę operatorem new[] o rozmiarze newArraySize, następnie przekopiowałbyć elementy ze starej tablicy oldArray do nowej funkcją std::copy z <algorithm>:

std::copy(oldArray, oldArray + oldArraySize, newArray);

Po czym zwolniłbyś tablicę wskazywaną przez oldArray operatorem delete i zwrócił nową tablicę. Pozdrawiam :)

Podobne pytania

0 głosów
1 odpowiedź 479 wizyt
pytanie zadane 6 listopada 2015 w Inne języki przez Mateep Użytkownik (850 p.)
0 głosów
1 odpowiedź 192 wizyt
pytanie zadane 19 listopada 2018 w C i C++ przez MAXIM7 Obywatel (1,990 p.)
0 głosów
1 odpowiedź 215 wizyt
pytanie zadane 4 sierpnia 2020 w C i C++ przez Arek04 Użytkownik (700 p.)

92,555 zapytań

141,402 odpowiedzi

319,539 komentarzy

61,938 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...