eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.misc.elektronikaC - łańcuchy tekstowe definiowane w parametrach funkcjiRe: C - łańcuchy tekstowe definiowane w parametrach funkcji
  • X-Received: by 2002:a05:622a:1214:b0:344:5ec8:d620 with SMTP id
    y20-20020a05622a121400b003445ec8d620mr3630498qtx.228.1661608779136; Sat,
    27 Aug 2022 06:59:39 -0700 (PDT)
    X-Received: by 2002:a05:622a:1214:b0:344:5ec8:d620 with SMTP id
    y20-20020a05622a121400b003445ec8d620mr3630498qtx.228.1661608779136; Sat,
    27 Aug 2022 06:59:39 -0700 (PDT)
    Path: news-archive.icm.edu.pl!news.icm.edu.pl!newsfeed.pionier.net.pl!2.eu.feeder.erj
    e.net!3.eu.feeder.erje.net!feeder.erje.net!border-1.nntp.ord.giganews.com!nntp.
    giganews.com!news-out.google.com!nntp.google.com!postnews.google.com!google-gro
    ups.googlegroups.com!not-for-mail
    Newsgroups: pl.misc.elektronika
    Date: Sat, 27 Aug 2022 06:59:38 -0700 (PDT)
    In-Reply-To: <6309f91e$0$6211$65785112@news.neostrada.pl>
    Injection-Info: google-groups.googlegroups.com; posting-host=5.172.255.94;
    posting-account=fcN60AoAAACGnErMsW3A8rTO2UKkGJEn
    NNTP-Posting-Host: 5.172.255.94
    References: <6308cdf1$0$6193$65785112@news.neostrada.pl>
    <4...@g...com>
    <63091035$0$560$65785112@news.neostrada.pl>
    <1...@g...com>
    <6309b565$0$6193$65785112@news.neostrada.pl>
    <0...@g...com>
    <6309f91e$0$6211$65785112@news.neostrada.pl>
    User-Agent: G2/1.0
    MIME-Version: 1.0
    Message-ID: <e...@g...com>
    Subject: Re: C - łańcuchy tekstowe definiowane w parametrach funkcji
    From: Dawid Rutkowski <d...@w...pl>
    Injection-Date: Sat, 27 Aug 2022 13:59:39 +0000
    Content-Type: text/plain; charset="UTF-8"
    Content-Transfer-Encoding: quoted-printable
    Lines: 62
    Xref: news-archive.icm.edu.pl pl.misc.elektronika:773968
    [ ukryj nagłówki ]

    sobota, 27 sierpnia 2022 o 12:59:44 UTC+2 Atlantis napisał(a):
    > 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.

    Piszesz w C.
    Nie w asemblerze, który z tego C zrobi kompilator.
    Zrobi jak zrobi i może nawet działać.
    Ale nie ma pewności.
    Inny kompilator, a nawet ten sam z innym -Ox, może zrobić inaczej i działać już nie
    będzie.
    Jak jest send("tekscik") to po zakończeniu tej funkcji "tekscik" w tym samym miejscu
    w pamięci może dalej być, ale nie musi.
    Dlatego należy go skopiować - albo dawać wskaźnik na globala.
    Tyle z punktu widzenia C.
    Wskaźniki nie są do zabawy - bardzo łatwo utrudnić sobie życie.

    Cóż, nikt do C nie zmusza - można pusać w assemblerze, możnasobie zmodyfikować język
    i kompilator - tylko wtedy już nie będzie to C.

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: