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

Dziwne zachowanie free

Object Storage Arubacloud
0 głosów
212 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 (194,920 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,320 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 (194,920 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 Ekspert (344,860 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 Ekspert (344,860 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 68 wizyt
pytanie zadane 30 stycznia 2021 w C i C++ przez tonn204 Mądrala (7,440 p.)
0 głosów
0 odpowiedzi 196 wizyt
pytanie zadane 31 grudnia 2020 w C i C++ przez tonn204 Mądrala (7,440 p.)
0 głosów
1 odpowiedź 215 wizyt
pytanie zadane 17 grudnia 2019 w C i C++ przez profesorek96 Szeryf (91,420 p.)

92,579 zapytań

141,431 odpowiedzi

319,657 komentarzy

61,963 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!

...