-
Data: 2022-08-27 10:28:01
Temat: Re: C - łańcuchy tekstowe definiowane w parametrach funkcji
Od: Dawid Rutkowski <d...@w...pl> szukaj wiadomości tego autora
[ pokaż wszystkie nagłówki ]sobota, 27 sierpnia 2022 o 08:11:18 UTC+2 Atlantis napisał(a):
> On 26.08.2022 22:19, Dawid Rutkowski wrote:
>
> > Ale wymyśliłeś... Ogólnie należy przypomnieć sobie C - i niezależnie,
> > co zrobi kompilator, taka zmienna będąca argumentem funkcji ma
> > gwarantowany czas życia tylko do wyjścia z tego konkretnego wywołania
> > tej funkcji (a jeszcze może chciałbyś "reentrant"?). Tak jest w C i
> > tyle.
> Jeśli już proponujesz przypomnienie sobie C, to należałoby sobie
> przypomnieć czym jest const char* (albo char*) w tym języku. Tutaj nie
> mamy do czynienia z czymś takim jak String C++ albo innych językach
> wysokiego poziomu. To nie jest obiekt albo kontener na dane, podczas
> tworzenia którego zachodziłaby alokacja pamięci.
> To jest po prostu zwykły wskaźnik, który przechowuje jedną, jedyną
> informację - adres początku łańcucha znaków w pamięci.
>
> Żeby pokazać różnicę, wyobraźmy sobie następną sytuację w C:
>
>
> const char* globalny_wskaznik = NULL;
>
> void foo(const char* str) {
> globalny_wskaznik=str;
> }
>
> Z następującą sytuacją w C++:
>
> std::String globalny_string;
>
> void bar(std::String str) {
> globalny_string = str;
> }
>
>
> Co się stanie po wywołaniu pierwszej funkcji? Otrzyma ona wskaźnik z
> adresem na jakiś obszar w pamięci. Adres ten zostanie przekopiowany do
> globalnego wskaźnika, a sam str zostanie zdjęty ze stosu. To co się
> będzie działo z samymi danymi na które wskazywał nie jest w żaden sposób
> określone - wszystko zależy od tego o jakim typie pamięci mówimy. Mogą
> rezydować wiecznie we flashu, mogą być cały czas dostępne jako zmienna
> globalna w RAM-ie, ale mogą też zniknąć w wyniku zdjęcia ze stosu albo
> dealokacji ze sterty w innej części programu.
>
> Co się natomiast dzieje w drugim przykłaadzie? Wywołanie funkcji
> powoduje utworzenie obiektu klasy std::String, który zostaje
> zainicjowany konkretnym tekstem i utworzy swoją instancję w pamięci. W
> skutek użycia operacji przypisania zostanie wywołany konstruktor
> kopiujący, który utworzy osobną kopię zawartości str w obiekcie
> globalny_string. Po wyjściu z funkcji bar zostanie wywołany destruktor
> obiektu str, jednak jego globalna kopia będzie nadal istniała.
Tutaj już czas na przypomnienie sobie "Alicji w krainie czarów" - rozdziału z
piosenką bodajże Białego Rycerza (czyli skoczka):
"Nazwa tej piosenki nazywa się >>rybie oczy<<" itd.
Czyli różnica między nazwą wskaźnika, zawartością wskaźnika, nazwą tablicy i
zawartością tablicy.
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.
Jakaś sekta twierdzii, że "dynamicznie" można tworzyć tylko obiekty?
Różnica jest tylko taka, że przy tworzeniu obiektu wywoływany jest konstruktor (w C++
cholera wie, który).
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...
Czyli czy nie wolno:
aArg=b;
czy
aArg[3]=c;
Bo była chyba jeszcze konstrukcja, która nie pozwalała na to inne podstawienie.
Ogólnie to są bzdury do męczenia studentów.
C K&R rulez na wieki ;>
Następne wpisy z tego wątku
- 27.08.22 11:34 Marek
- 27.08.22 11:53 JDX
- 27.08.22 12:59 Atlantis
- 27.08.22 15:59 Dawid Rutkowski
- 27.08.22 16:06 Dawid Rutkowski
- 27.08.22 16:53 J.F
- 27.08.22 20:30 a...@m...uni.wroc.pl
- 27.08.22 20:55 JDX
- 27.08.22 21:43 Dawid Rutkowski
- 28.08.22 12:34 JDX
- 28.08.22 14:27 Dawid Rutkowski
- 28.08.22 14:30 Atlantis
- 29.08.22 07:29 JDX
- 29.08.22 10:25 Krzysztof Gajdemski
Najnowsze wątki z tej grupy
- Dziwne zachowanie magistrali adresowej w 8085
- Współczesne mierniki zniekształceń nieliniowych THD audio, produkują jakieś?
- Jaki silikon lub może klej?
- Smar do video
- Litowe baterie AA Li/FeS2 a alkaliczne
- "ogrodowa linia napowietrzna"
- jaki zasilacz laboratoryjny
- jaki zasilacz laboratoryjny
- Puszka w ziemię
- T-1000 was here
- Ściąganie hasła frezem
- Koszyk okrągły, walec 3x AA, na duże paluszki R6
- Brak bolca ochronnego ładowarki oznacza pożar
- AMS spalony szybkim zasilaczem USB
- stalowe bezpieczniki
Najnowsze wątki
- 2025-02-12 Warszawa => Expert Recruiter 360 <=
- 2025-02-12 Ostrów Wielkopolski => Area Sales Manager OZE <=
- 2025-02-12 Bieruń => Regionalny Kierownik Sprzedaży (OZE) <=
- 2025-02-12 Dęblin => Node.js / Fullstack Developer <=
- 2025-02-12 Kraków => PHP Full Stack Developer <=
- 2025-02-12 Karta dźwiękowa stereo
- 2025-02-12 Dęblin => JavaScript / Node / Fullstack Developer <=
- 2025-02-12 Gdańsk => Specjalista ds. Sprzedaży <=
- 2025-02-12 Łódź => NodeJS Developer <=
- 2025-02-12 Błonie => Sales Specialist <=
- 2025-02-12 Dziwne zachowanie magistrali adresowej w 8085
- 2025-02-11 Mini pecet
- 2025-02-10 Spalił się spaliniak
- 2025-02-10 zarowka wifi - z sensowna apka lub lepiej albo lokalnie lub przez web. I zeby harmonogram miala
- 2025-02-10 Chrzanów => Programista NodeJS <=