Witamy na forum PC Format Zapraszamy do REJESTRACJI


Użytkownicy przeglądający ten wątek: 1 gości

Niuanse adresacji pamięci przez funkcje malloc()

#1
Niuanse adresacji pamięci przez funkcje malloc()
Witam wszystkich.
Na wstępie jak zawsze krótki kodzik.
Kod:
#include <stdio.h>
#include <stdlib.h>
struct menu
{
    int *wsk1;
}*lista;

int main()
{
    lista=malloc(sizeof(*lista));
    //lista->wsk1=malloc(sizeof(*lista));
    puts("wprowadz tekst:");
    scanf("%s",lista->wsk1);
    printf("%s",lista->wsk1);
}
po uruchomieniu aplikacji i wpisaniu danych do zmiennej *wsk1 program zacina się.Rozumiem, że z powodu braku adresacji pamięci na zmienną wskaźnikową *wsk1.
Ale dlaczego pamięć mogę zaadresować tylko w formie
Kod:
lista->wsk1=malloc(sizeof(*lista));
a nie mogę tak
Kod:
lista->wsk1=malloc(sizeof(*wsk1));
co wydaje mi sie prawidłowszą formą niestety niezgadza sie ze mną kompilator Wesoły
 System operacyjny: windows_vista Przeglądarka: ie8
#2
RE: Niuanse adresacji pamięci przez funkcje malloc()
Witam, na początku wskaźnik lista pokazuje na jakiś przypadkowy adres pamięci (który nie jest własnością uruchomionego programu), dlatego nie można się odwołać do pola wsk1.
 System operacyjny: linux_ubuntu Przeglądarka: firefox
#3
RE: Niuanse adresacji pamięci przez funkcje malloc()
Witam na początku chciałem podziękować szachiscie za szybką pomoc.
Szachista napisał:
Cytat:"na początku wskaźnik lista pokazuje na jakiś przypadkowy adres pamięci (który nie jest własnością uruchomionego programu)".
Myślałem że przydzielenie pamięci przez malloc(),daje to: że wskaźnik lista jest zaadresowany(jest to wartość=adres znana uruchomionemu właśnie programowi), tymczasem szachista napisał:
Cytat:"wskaźnik lista pokazuje na jakiś przypadkowy adres pamięci".
Jak to jest bo już wogóle się pogubiłem.
I jeszcze jedno.
Szacista napisał, że na początku wskaźnik lista pokazuje przypadkowy adres ale od kiedy jest ten początek(proszę o wskazanie go w kodzie),i od kiedy adres wskaźnika lista będzie już znany programowi by można było się odwołać i zaalokować pamięć na *wsk1.
 System operacyjny: windows_xp_2003 Przeglądarka: opera
#4
RE: Niuanse adresacji pamięci przez funkcje malloc()
Gdy program zaczyna się wykonywać, to w pamięci statycznej (ponieważ wskaźnik lista jest zmienną globalną) ląduje ten wskaźnik (czyli zmienna pokazująca na jakiś adres). Gdy program "wchodzi" do funkcji main, wtedy możesz przydzielić pamięć i zachować ten adres we wskaźniku lista, tak jak to uczyniłeś:
Kod:
lista=malloc(sizeof(*lista));
Pamięć dla tego obiektu została przydzielona, ale w środku znajduje się wskaźnik, który pokazuje na coś przypadkowego, zatem
Kod:
lista->wsk1=malloc(sizeof(*lista));
W tym przypadku rozmiar powinien inaczej być podany. Jeśli chciałbyś utworzyć tablicę dla 5 elementów typu int, to należy to zrobić tak:
Kod:
lista->wsk1=(int*)malloc(5 * sizeof(int));
Proponuję poczytać jeszcze o rzutowaniu i zwalnianiu pamięci (funkcja free()).
 System operacyjny: linux_ubuntu Przeglądarka: firefox
#5
RE: Niuanse adresacji pamięci przez funkcje malloc()
Witam wszystkich.
Szachisto bardzo dziękuje ci za wyczerpującą odpowiedz teraz wszystko jest jasne.
Co do funkcji free() to wiem ze zwalnia pamięć, i trzeba ją stosować aby nie dochodziło do "wycieku pamięci", ale ciągle o tym zapominam, ale obiecuje sobie wziąść to do serca.
A co do rzutowania to fakt muszę sie jeszcze dokształcić.
Jeszcze raz dziękuje i pozdrawiam wszystkich.
 System operacyjny: windows_xp_2003 Przeglądarka: ie8
Programy: Polecane / Nowe / Inne




Podobne wątki (Niuanse adresacji pamięci przez funkcje malloc())
Wątek: Autor Odpowiedzi: Wyświetleń: Ostatni post
  Gdzie znaleźć funkcje biblioteczne [c++] kramloch 6 7760 21.06.2015, 17:47
Ostatni post: kramloch
Ściana [C++] Tablica wskaźników na funkcje - niedziałający program ;/ kolor200 5 3031 30.01.2014, 15:10
Ostatni post: Szachista
  Zasada przydzielania pamięci przez funkcję - malloc() w języku c. wanhelsing 2 2832 29.01.2014, 19:34
Ostatni post: wanhelsing

Skocz do:


Wybrane wątki (Niuanse adresacji pamięci przez funkcje malloc())
Wątek: Autor Odpowiedzi: Wyświetleń: Ostatni post
  Środowisko do assemblera Physicist 4 2486 21.04.2019 14:04
Ostatni post: Ajgor
  VBA excel dmjs 6 2518 17.04.2019 10:20
Ostatni post: ptrick
  C++ gbr 5 3111 25.03.2019 12:53
Ostatni post: koneton
  Klasa wewnętrzna w C++ Physicist 4 3084 23.03.2019 18:28
Ostatni post: Physicist
  Ruby on Rails - tutoriale luciussulla 0 2768 23.03.2019 16:49
Ostatni post: luciussulla
Big Grin Czy dostane sie technikum informatycznego klaudiusz20046 6 4893 21.03.2019 01:28
Ostatni post: UnableToSee
  [C#] Program do moderacji czatów gier wiktrom12 0 3237 07.03.2019 15:33
Ostatni post: wiktrom12
  Mój pierwszy projekt - Pomoc rafal12999 1 3725 07.02.2019 22:01
Ostatni post: Szachista
  pomoc projekt scilab piesel18 2 4664 04.02.2019 09:03
Ostatni post: piesel18
  Szkoła Informatyczna Zikinan 1 4031 02.02.2019 17:59
Ostatni post: wojownikhaha
  [Java] Strona z zadaniami do rozwiązania i odpowiedziami rafal12999 2 4975 27.01.2019 13:44
Ostatni post: rafal12999
  kompilacja biblioteki Agui - cmake jurek2 0 4380 10.01.2019 13:12
Ostatni post: jurek2
  Zamiana całego zestawu znaków wg przyporządkowania BarHorab 5 5124 19.12.2018 16:45
Ostatni post: Szachista
  Sumowanie licz excel - problem OxyGenE 2 8159 19.12.2018 16:29
Ostatni post: Szachista
  Transfer plików via FTP Visual Basic FireBytes 1 3232 17.11.2018 21:07
Ostatni post: Szachista