Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

wskazniki i struktury

Ostatnio zmodyfikowano 2015-03-21 18:41
Autor Wiadomość
Dizip
Temat założony przez niniejszego użytkownika
wskazniki i struktury
» 2015-03-21 15:46:55
Proste pytanie: Czy te 2 kody są sobie równoznaczne ? Robie liste i myślę jak to inicjalizować. Wskaźniki dają szerokie pole by popełnić bład ;/
1)

   struct list * wsk,*tmp,*head;
    wsk= ( struct list *) malloc(sizeof(struct list));
    tmp=head=wsk;
   
 2)  

    struct list * wsk= ( struct list *) malloc(sizeof(struct list));
    struct list * tmp = ( struct list *) malloc(sizeof(struct list));
    struct list * head= ( struct list *) malloc(sizeof(struct list));
I ktorego powinienem uzyć? ogolnie wsk - aktualne wpisywanie danych
tmp - zapisywanie polaczenia miedzy wyrazem i jego poprzednikiem
head - poczatek

   
   
   
P-128878
Brunon3
» 2015-03-21 15:59:58
Rozumiem że to ma być w C?

Ja patrząc tak po projektach widziałem często zapis a'la (1).
Sam nigdy tego nie stosowałem więc nie mogę się więcej wypowiedzieć.

-BD.
P-128879
Dizip
Temat założony przez niniejszego użytkownika
» 2015-03-21 17:54:15
Tak w C. Martwie się tylko czy takim zapsisem nie uciekam gdzieś poza pamięć
P-128883
Monika90
» 2015-03-21 17:58:34
W pierwszym przypadku wywołujesz malloc raz, a w drugim 3 razy, więc nie są równoważne.
P-128884
Lora
» 2015-03-21 18:01:45
W pierwszym przypadku, wszystkie trzy wskaźniki wskazują na to samo miejsce w pamięci, a w drugim każdy wskaźnik wskazuje na inne miejsce. W tym pierwszym przypadku trzeba uważać, żeby nie zrobić czegoś takiego:
C/C++
wsk->wartosc = 5;
free( wsk ); // zwalniasz pamięć, na którą wskazują wszystkie trzy wskaźniki
tmp->wartosc = 2; // wyjście poza pamięć
P-128885
Dizip
Temat założony przez niniejszego użytkownika
» 2015-03-21 18:25:45
Czyli tworząc taką 'mini liste' nie naruszam żadnej pamięci?  Tzn czy nie wchodzę na obszary nie dla mnie.

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

struct list
{
    int liczba;
    struct list *nast;
};


int main(void)
{
    int i;
    struct list * wsk=0,*tmp=0,*head=0;
    for(i=0;i<5;i++)
    {
        if(wsk==NULL){
            wsk= ( struct list *) malloc(sizeof(struct list));
            scanf("%d",&wsk->liczba);
            tmp=head=wsk;
        }
        else
        {
            wsk= ( struct list *) malloc(sizeof(struct list));
            scanf("%d",&wsk->liczba);
            tmp->nast=wsk;
            tmp=tmp->nast;
        }
    }

    while( head )
    {
        printf("%d ",head->liczba);
        head=head->nast;
    }

    return 0;
}
P-128886
Lora
» 2015-03-21 18:34:18
Po tej pętli for rób jeszcze coś takiego:
C/C++
tmp->nast = NULL;
Inaczej ta druga pętla nie będzie się kończyć.
P-128888
Dizip
Temat założony przez niniejszego użytkownika
» 2015-03-21 18:36:23
tzn po jej skończeniu czy jakoś przy obiegach?
P-128889
« 1 » 2
  Strona 1 z 2 Następna strona