• 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ą.

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
0 głosów
862 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ź 572 wizyt
pytanie zadane 6 listopada 2015 w Inne języki przez Mateep Użytkownik (850 p.)
0 głosów
1 odpowiedź 301 wizyt
pytanie zadane 19 listopada 2018 w C i C++ przez MAXIM7 Obywatel (1,990 p.)
0 głosów
1 odpowiedź 282 wizyt
pytanie zadane 4 sierpnia 2020 w C i C++ przez Arek04 Użytkownik (740 p.)

93,430 zapytań

142,427 odpowiedzi

322,652 komentarzy

62,794 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

...