logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[AVR][C] - Zmienne tekstowe char, rozmiar zmiennej a rozmiar tekstu

klocek_ 11 Mar 2013 23:41 1575 5
REKLAMA
  • #1 12048999
    klocek_
    Poziom 9  
    Witajcie,

    jakiś czas temu miałem okazję wykorzystywać funkcję itoa(), która jako parametr przyjmuje m.in. bufor, w którym umieszczę wygenerowany tekst.

    I teraz tak. Zadeklarowałem sobie bufor:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    który pomieści mi 9 znaków (plus 0).

    Wywołuję funkcję itoa():
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    i ona wygeneruje mi tekst długości 5 (4 znaki plus 0). I teraz moje pytanie - co się dzieje z pozostałymi 5 bajtami, które zadeklarowałem wyżej?

    Wszelka obsługa napisów przetwarza napis (tablicę) do momentu napotkania zera. A co z tymi bajtami, które początkowo zająłem, ale znajdują się "za" zerem i zostają pominięte przy przetwarzaniu napisu?
  • REKLAMA
  • #2 12049032
    excray
    Poziom 41  
    Nic. Zostały zadeklarowane więc nie zostaną nigdzie indziej użyte. Kolokwialnie mówiąc "marnują się".
  • REKLAMA
  • #3 12049039
    BlueDraco
    Specjalista - Mikrokontrolery
    Ano leżą sobie te bajt nieużywane i czekają na lepsze czasy. Kiedyś jak zapiszesz do bufora więcej niż 4 znaki - będą potrzebne.
    W każdym razie w C rozmiar zmiennej nie zmienia się w zależności od potrzeb.
  • REKLAMA
  • #4 12049052
    piotrva
    VIP Zasłużony dla elektroda
    Leżą odłogiem - nic się z nimi nie dzieje, nie jestem tylko pewny (trzeba by zapytać dociekliwych ekspertów C), czy są one nadpisywane jakąś wartością, ale wydaje mi się, że nie. Z tego co mi wiadomo program po prostu zapisze do pierwszych 4 bajtów dane ASCII, w piątym postawi \0, a bajty 6-10 pozostaną niezmienione - ale tu prosiłbym o potwierdzenie tej wiadomości kogoś bardziej wnikającego w te operacje.
  • REKLAMA
  • #5 12049061
    klocek_
    Poziom 9  
    Okej, czyli gdy zaalokuję sobie pamięć na napis tak:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    a następnie wpiszę do niej wspomniane 5 znaków (4 cyfry + 0), a dalej użyję
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
    to zwolni mi wszystkie 10 bajtów?

    Chodzi mi o to, czy nie dojdzie do sytuacji, że gdy zaalokuję 10 bajtów, a będę używał połowy z nich, to czy nie dojdzie do wycieku pamięci? Czy gdy zwolnię pamięć tak jak wyżej, to pominie mi tych 5 niezajętych bajtów i już mi pamięci dostępnej ubędzie?

    Czy może wogóle free() zwolni mi tylko pierwszy bajt, a o resztę muszę sam zadbać (wszak to tablica, a nie struktura która ma z góry wiadomy rozmiar)?
  • #6 12049072
    BlueDraco
    Specjalista - Mikrokontrolery
    free zwalnia obszar wskazywany przez wskaźnik, nie patrząc, co on zawiera. Zwolni tyle bajtów, ile było zaalokowanych przez malloc. Z tym, że wypada wspomnieć, że malloc/free, żeby w ogóle mogły działać, do każdego zaalokowanego obszaru dokładają (na ogół, szczegóły zależą od realizacji alokatora) min. dwie zmienne typu size_t - w procesorach 8- i 16- bitowych będą to 2*2 bajty, a w 32-bitowych - 2*4. Ogólnie alokacja dynamiczna obszarów poniżej kilkuset bajtów ma niewielki sens, a alokacja dynamiczna w niewielkich mirkokontrolerach w zasadzie jest bez sensu.
REKLAMA