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

Dziwne zachowanie free

Cloud VPS
0 głosów
567 wizyt
pytanie zadane 7 listopada 2023 w C i C++ przez Daaa22 Dyskutant (8,250 p.)

Ten kod zwraca 0 bez pokazania nawet jednego "X" na ekranie.

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

struct List
{
    int value;
    struct List* next;
};

int main()
{
    struct List first;
    struct List* current;
    
    int n, flag;
    
    printf("Podaj gorna granice: ");
    scanf("%d", &n);
    
    //ustawianie wartosci w liscie (pomijam liczby podzielne przez 2,3,5 i kwadraty)
    current = &first;
    for(int i = 7; i <= n; i++)
    {
        if(i % 2 == 0 || i % 3 == 0 || i % 5 == 0)
            continue;
            
        flag = 0;
        for(int j = 2; j <= sqrt(n); j++)
            if(i % (j*j) == 0)
            {
                flag = 1;
                break;
            }
            
        if(flag == 1)
            continue;
            
        current->value = i;
        current->next = malloc(sizeof(struct List));
        current = current->next;
    }
    
    printf("X");
    free(current);
    printf("X");
    
    current = &first;
    while(current != 0)
    {
        printf("%d ", current->value);
        current = current->next;
    }

    return 0;
}

Jeżeli usunę linijkę "free(current);", to jest wszystko okej. Czemu printf przed free nie działa? Czemu nie mogę usunąć ostatniego elementu z listy?

komentarz 8 listopada 2023 przez j23 Mędrzec (195,240 p.)

Nawiasem:

  • nie ustawiasz wskaźnika next na null w nowym węźle, co oczywiście może wywrócić program w trakcie wyświetlania całej listy.
  • pierwszy element jest tworzony na stosie, wywołanie free na nim to błąd i wywrotka programu.
komentarz 8 listopada 2023 przez Oscar Nałogowiec (29,360 p.)
A drugi printf(X) działa? Po czym poznajesz który jest drugi, a który pierwszy?

Masz sporo błedów. Jak już wspomniano - dziwne jest to, że pierwszy element jest allokowany automatycznie, a nie na stercie. Lepiej by first to był wskażnik - jak jest NULL to lista jest pusta, w twoim rozwiązaniu nie można mieć pustej listy.

W okolicy linii 40 allokujesz mową strukturę, ale nic z nią nie robisz. Ostatni wypełniony element pokazuje na element co prawda zaalokowany ale nie zainicjowany. Użyj choć calloc - ta funkcja zeruje pamięć, next będzie NULL-em.

To wszystko skutek tego pierwszego problemu - masz już pierwszy element więc pętla powinna inaczej traktować pierwszą daną a inaczej reszte.
komentarz 10 listopada 2023 przez Daaa22 Dyskutant (8,250 p.)

@j23, myślałem że automatycznie się wskaźnik na null ustawia jak nic nie ustawiłem, to mogę poprawić. A nie wywołuje free na stosie, założenie jest że input to liczba większa od 7

komentarz 10 listopada 2023 przez Daaa22 Dyskutant (8,250 p.)

@Oscar,  po kolejności w kodzie,

Nie wpadłem na to że mogę pierwszy na stercie zrobić, poprawie 

 

 

komentarz 10 listopada 2023 przez j23 Mędrzec (195,240 p.)
edycja 11 listopada 2023 przez j23

@Daaa22, w C mało rzeczy robi się automatycznie ;) Na null ustawiają się tylko wskaźniki zdefiniowane globalnie lub jako statyczne. Reszta to czysta loteria.

1 odpowiedź

+1 głos
odpowiedź 8 listopada 2023 przez adrian17 Mentor (354,700 p.)
Bez wczytywania się w algorytm: pierwszy element listy nie jest alokowany dynamicznie, więc jeśli przypadkiem zrobisz free() na nim to program się wywali.

Czemu pierwszego "X" nie widać: pewnie dlatego że printf wrzucił ten tekst do wewnętrznego bufora do wyświetlenia później, ale to "później" nie przychodzi skoro program się wywala chwilę później. Spróbuj zamiast tego `printf("X\n");`, wypisanie nowej linii zazwyczaj wymusza wyświetlenie tej linii w konsoli od razu.
komentarz 8 listopada 2023 przez Daaa22 Dyskutant (8,250 p.)
Tak, ale nie robię free dla pierwszego elementu.
komentarz 8 listopada 2023 przez adrian17 Mentor (354,700 p.)
OK, a jakie przykładowe wejście wpisujesz że to się dzieje?
komentarz 10 listopada 2023 przez Daaa22 Dyskutant (8,250 p.)
Każde n większe od 7 (z mniejszym też nie działa ale założenie jest że wejście jest większe od 7)

Podobne pytania

0 głosów
0 odpowiedzi 101 wizyt
pytanie zadane 30 stycznia 2021 w C i C++ przez tonn204 Mądrala (7,470 p.)
0 głosów
0 odpowiedzi 337 wizyt
pytanie zadane 31 grudnia 2020 w C i C++ przez tonn204 Mądrala (7,470 p.)
0 głosów
1 odpowiedź 481 wizyt
pytanie zadane 17 grudnia 2019 w C i C++ przez profesorek96 Szeryf (91,400 p.)

93,487 zapytań

142,420 odpowiedzi

322,772 komentarzy

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

Kursy INF.02 i INF.03
...