eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.misc.elektronikaC - łańcuchy tekstowe definiowane w parametrach funkcjiRe: C - łańcuchy tekstowe definiowane w parametrach funkcji
  • Data: 2022-08-27 12:59:42
    Temat: Re: C - łańcuchy tekstowe definiowane w parametrach funkcji
    Od: Atlantis <m...@w...pl> szukaj wiadomości tego autora
    [ pokaż wszystkie nagłówki ]

    On 27.08.2022 10:28, Dawid Rutkowski wrote:

    > Przy wywołaniu send("tekscik"), gdy send(const char *aArg),
    > "tworzony" jest zarówno wskaźnik aArg jak i anonimowa tablica z zawartością
    "tekscik".
    > I obie te zmienne mają czas życia do zakończenia wywołania tej funkcji.

    Tutaj nie masz racji, a przynajmniej opisywane przez Ciebie zachowanie
    nie jest żadną uniwersalną regułą. Nie ma żadnej zasady która mówiłaby,
    że anonimowa tablica jest tworzona na stosie tuż przed utworzeniem
    wskaźnika, który by na nią wskazywał.
    Takie ciągi znaków zwykle są zbierane podczas kompilacji i umieszczone w
    rodata (czyli w przypadku mikrokontrolerów najczęściej we flashu) i
    potem po prostu wskaźnik będzie inicjowany wartością wskazującą na
    początek odpowiedniego ciągu znaków.
    Widać to chociażby w HEX-ach wsadów do starszych systemów
    mikroprocesorowych (Z80, 8051) gdzie wszystkie teksty są zebrane w
    jednym miejscu.
    Problemy pojawiają się w przypadku niektórych architektur, gdzie
    kompilator (o ile nie poinformujemy go, by robił inaczej) będzie przy
    starcie programu kopiował dane do RAM-u, bo wskaźnik na dane w RAM-ie i
    we flashu to nie to samo. Nawet wtedy ciągle jednak będą one istniały
    cały czas w formie zmiennych globalnych, a nie zostanę ulokowane na stosie.

    Moje pytanie odnosiło się do czegoś innego - chciałem się upewnić, czy
    przypadkiem w pewnych sytuacjach program w sposób niejawny nie zrobi mi
    niespodzianki i np. zamiast użyć wskaźnika wprost do ciągu w rodata w
    sposób niejawny nie wygeneruje tymczasowego tekstu na stosie, złożonego
    z fragmentów innych tekstów, w ramach optymalizacji.


    > A co do send(const char *aArg)
    > to nigdy nie potrafiłem zapamiętać, czy zabronione jest zmienianie
    > wartośvi aArg czy też wartości wskazywanej...

    w przypadku const char* masz do czynienia ze wskaźnikiem na const char.
    Czyli nie wolno ci modyfikować wartości na którą wskazuje wskaźnik, ale
    już sam wskaźnik możesz modyfikować. Zabronione jest *aArg='a', ale już
    jak najbardziej wykonasz aArg++. Bez tego nie byłoby przecież możliwe
    iterowanie po łańcuchach tekstowych w formie const char*.
    W C istnieją też wskaźniki char* const - w tym przypadku możesz
    modyfikować zawartość, ale już nie wolno zmienić adresu na który
    wskazuje wskaźnik.
    Dostępna jest też najbardziej restrykcyjna kombinacja: const char* const
    - ani nie zmodyfikujesz wartości, ani adresu na który wskazuje wskaźnik.

Podziel się

Poleć ten post znajomemu poleć

Wydrukuj ten post drukuj


Następne wpisy z tego wątku

Najnowsze wątki z tej grupy


Najnowsze wątki

Szukaj w grupach

Eksperci egospodarka.pl

1 1 1

Wpisz nazwę miasta, dla którego chcesz znaleźć jednostkę ZUS.

Wzory dokumentów

Bezpłatne wzory dokumentów i formularzy.
Wyszukaj i pobierz za darmo: