Program w C, problemy ze wskaźnikami.

0

http://www.wklejto.pl/157613 Mam problem ze swoją funkcją 'dodaj'. Może mi ktoś powiedzieć jak mam sie pozbyć tego błędu przy wypisywaniu?

0

JAKI BŁĄD?!

0

Hahahhahah, ktoś ma problem i nawet nie mówi co jest nie tak XD

0

Problem masz w main() a nawet 3 problemy:

  1. Nie przydzielasz pamięci pod imie/nazwisko
  2. Przy wprowadzaniu nie ograniczasz długości.
  3. w scanf'ie podajesz adres adresu - WTF!
0
_13th_Dragon napisał(a):

Problem masz w main() a nawet 3 problemy:

Nie przydzielasz pamięci pod imie/nazwisko

Przecież mallockiem przydzieliłem pamięć.

_13th_Dragon napisał(a):

Przy wprowadzaniu nie ograniczasz długości.

_13th_Dragon napisał(a):

w scanf'ie podajesz adres adresu - WTF!

W scanf zawsze się podaje & więc nie rozumiem.

Byłbym wdzięczny gdybyś mocniej mnie tą pałką stuknął.

0

Przekleję cały program kolegi coby nie gadać o suchym pysku.

#include<stdlib.h>
#include<stdio.h>
 
typedef struct studia
{
    char *imie;
    char *nazwisko;
    int rok_stud;
    struct studia *wsk;
}student;
 
student *poczatek=NULL, *koniec=NULL;
 
void dodaj(student *poczatek_temp, student temp, int n)
{
    student *pointer, *nowy;
    short error=0;
    int i;
    nowy=(student*)malloc(sizeof(student));
    *nowy->imie=temp.imie;
    *nowy->nazwisko=temp.nazwisko;
    nowy->rok_stud=temp.rok_stud;
 
    pointer = poczatek_temp;
    for(i=0; i<n; ++i)
    {
       if(pointer==NULL)
       {
           printf("Error.\n");
           error=1;
           break;
       }
       pointer=pointer->wsk;
    }
    if(error!=1)
    {
        if(i==0)
        {
            nowy->wsk=pointer;
            poczatek=nowy;
        }
        else
        {
            nowy->wsk=pointer->wsk;
            pointer->wsk=nowy;
        }
    }
 
}
 
void wypisz (student *temp_poczatkowy)
{
    student *pointer=temp_poczatkowy;
    printf("Zapisani.\n");
    while(pointer!=NULL)
    {
        printf("%s\t%s\t %d\n", pointer->imie, pointer->nazwisko, pointer->rok_stud);
        pointer=pointer->wsk;
    }
}
 
void usun(student *temp_poczatkowy, int n)
{
    short error=0;
    int i;
    student *pointer=temp_poczatkowy;
    for(i=0; i<n; ++i)
    {
       if(pointer==NULL)
       {
           printf("Error.\n");
           error=1;
           break;
       }
       pointer=pointer->wsk;
    }
    if(error!=1)
    {
        if(i==0)
        {
            poczatek=pointer->wsk;
            free(pointer);
        }
        else
        {
            pointer->wsk=(pointer->wsk)->wsk;
              if(pointer->wsk==NULL)
              {
                  koniec=pointer;
              }
            pointer=pointer->wsk;
            free(pointer);
 
        }
    }
 
}
int main()
{
    int menu, n;
    student kolejny;
 
    printf("\t\t\tBaza danych studentow.\n");
    do
    {
    printf("\nWybierz opcje: \n");
    printf("1 - Wyswietl\n2 - Dodaj\n3 - Usun\n");
 
 
 
    scanf("%d",&menu);
    switch(menu)
    {
        case 1:
                wypisz(poczatek);
        break;
 
        case 2:
             printf("Na które miejsce dodac?\n");
             scanf("%d", &n);
             printf("Podaj imie:\n");
             scanf("%s",&kolejny.imie);
 
             printf("Podaj nazwisko:\n");
             scanf("%s",&kolejny.nazwisko);
 
             printf("Podaj rok studiow:\n");
             scanf("%d",&kolejny.rok_stud);
 
             dodaj(poczatek, kolejny, n);
 
             break;
 
        case 3:
 
            printf("Podaj element do usuniecia.\n");
            scanf("%d", &n);
            usun(poczatek, n);
 
             break;
 
        case 4:
            printf("Papa\n");
        break;
 
        default:
                printf("Podaj poprawny numer.\n");
 
    }
}while(menu!=4);
system("pause");
return 0;
}
0

Może od początku...

Gdy menu to zmienna typu int to możesz napisać:

scanf("%d",&menu);

Nie możesz napisać:

scanf("%s",&kolejny.imie);

kolejny.imie to pole typu char*, a więc wskaźnik, a więc znaczka & w scanf nie podajemy. Prawidłowo będzie:

scanf("%s",kolejny.imie);

Inna sprawa to to, że kolejny.imie to faktycznie nieprzydzielony fragment pamięci.

student kolejny;

tworzy egzemplarz struktury typu student przechowujący wskaźniki do napisów. Pisząc scanf jak powyżej próbujesz zapisać wpisany napis do wskaźnika nie wskazującego żadnego obszaru pamięci. Najpierw musisz przydzielić temu polu pamięć by móc do niego kierować wartości ze scanf.

kolejny.imie = malloc(100*sizeof(char));

Inna sprawa to to co napisałeś w funkcji dodaj:

student *pointer, *nowy;
int i;
nowy=(student*)malloc(sizeof(student));
*nowy->imie=temp.imie;
*nowy->nazwisko=temp.nazwisko;
nowy->rok_stud=temp.rok_stud;

Co z tego, że przydzieliłeś pamięć dla egzemplarza struktury student skoro nie przydzieliłeś pamięci polom imię i nazwisko?
Poza tym co to za przypisania? Dowiedz się jak przepisuje się napisy w C, bo to co powyżej świadczy o tym, że nie bardzo wiesz...

0

Czyli żebym dobrze zrozumiał. Mam stworzyć w funkcji dodaj

student kolejny;

i potem mallockiem stworzyc kolejny.imie i kolejny.nazwisko? Zastanawia mnie jednak jedna rzecz. Jeśli nie przydzieliłem pamięci to jakim cudem kolejny.rok_stud

 i to <code class="c">nowy->rok_stud=temp.rok_stud;

wyświetla mi poprawną wartość? Nigdzie nie mogę znaleźć jakoś dobrze (dla mnie) wytłumaczonego problemu struktur i wskaźników do nich i dlatego tworze takie potworki.

1 użytkowników online, w tym zalogowanych: 0, gości: 1