-
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.
Następne wpisy z tego wątku
- 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
- Thunderbird i dysk...
- opornosc falowa
- Bateria 9V 6F22, alkaliczna v cynkowa, samorozładowanie, bateria wysokiej trwałości do miernika
- Tani zakup z ali?
- w czasach LED komary mają ciężko
- walizka z kodami
- Rejestrator temperatur - termopara, siec
- Router LTE z możliwością zmian MTU
- Fajny film widziałem...
- Jaka ładowarka sieciowa do Iphona?
- Taśma izolacyjna do prac elektrycznych
- Recenzja 3.1A ;) w 6 gniazdach...
- Re: Recenzja 3.1A ;) w 6 gniazdach...
- Re: Recenzja 3.1A ;) w 6 gniazdach...
- Re: Recenzja 3.1A ;) w 6 gniazdach...
Najnowsze wątki
- 2025-07-25 Drastycznie rośnie import stali - w hucie w Dąbrowie Górniczej zostanie wygaszony wielki piec
- 2025-07-25 Drastycznie rośnie import stali - w hucie w Dąbrowie Górniczej zostanie wygaszony wielki piec
- 2025-07-25 I kolejny inżynier...
- 2025-07-25 Kobiety, bójcie się inżynierów...
- 2025-07-25 Warszawa => Konsultant Wiodący SAP PP <=
- 2025-07-25 Re: Brawo !!! Osy chronione w Niemczech. Za usunięcie gniazda grozi mandat
- 2025-07-25 cudzoziemiec bez biletu
- 2025-07-25 Gdynia => Sales Executive / KAM <=
- 2025-07-25 Inżynierzy z prawomocnym...
- 2025-07-25 Łódź => Mainframe (z/OS, Assembler) Developer <=
- 2025-07-25 Warszawa => Inżynier oprogramowania .Net <=
- 2025-07-25 Kraków => Senior Fullstack Engineer (Low-Code Platform) <=
- 2025-07-25 Skrobanie
- 2025-07-25 Lublin => Konsultant ds. Wdrożeń ERP (moduł FK) <=
- 2025-07-25 Warszawa => Senior Frontend Developer (React + React Native) <=