• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Wskaźnik na element stringa

Object Storage Arubacloud
0 głosów
263 wizyt
pytanie zadane 9 sierpnia 2018 w C i C++ przez Agnes Użytkownik (990 p.)
Może to głupie pytanie, ale co zrobić jeśli chcę aby wskaźnik p zawierał adres którejś litery jakiegoś napisu?

1 odpowiedź

0 głosów
odpowiedź 9 sierpnia 2018 przez Hiskiel Pasjonat (22,830 p.)
Nie widzę problemu

http://cpp.sh/3eplf
komentarz 9 sierpnia 2018 przez Agnes Użytkownik (990 p.)
No racja...
komentarz 9 sierpnia 2018 przez Hiskiel Pasjonat (22,830 p.)
Jednakże jest to dość niebezpieczne.
2
komentarz 9 sierpnia 2018 przez monika90 Pasjonat (22,940 p.)
Twój program ma niezdefiniowane zachowanie, przypisanie do stringa unieważnia wskaźnik.
komentarz 9 sierpnia 2018 przez Hiskiel Pasjonat (22,830 p.)
W jakim sensie unieważnia? String się realokuje przy przypisaniu, czy jak? (Choć to by było bez sensu, bo program działa). À propos niebiezpieczeństwa to pisałem o tym, że jak wskazujemy na literkę piątą ze stringa "12345", to gdy przypiszemy do stringa "123" wskażnik będzie wskazywał na głupoty.
1
komentarz 9 sierpnia 2018 przez mokrowski Mędrzec (155,460 p.)
W takim sensie unieważnia że standard nie definiuje całej polityki alokacji danych dla std::string. Definiuje jedynie obostrzenia co do wydajności wybranej polityki. Zmiana danych (przypisania, zwiększanie a także ... zmniejszanie), może powodować utratę prawidłowości wskaźnika. Wskaźnik jest poprawny upraszczając "jeśli nie będziesz modyfikował std::string". Jeśli go jakkolwiek modyfikujesz, spodziewaj się wszystkiego. Miałeś po prostu szczęście/nieszczęście (wybierz) że działa na konkretnej platformie, z konkretnym kompilatorem o konkretnej godzinie :-)

IMHO nieszczęście... Lepiej żeby się wywróciło :-)
komentarz 9 sierpnia 2018 przez Hiskiel Pasjonat (22,830 p.)
Co masz na myśli pisząc "polityka alokacji danych"? Dodatkowo - jak wyglądałby poprawny program?
komentarz 9 sierpnia 2018 przez mokrowski Mędrzec (155,460 p.)

Tworząc string, wywołujesz alokowanie pamięci na dane. Z zasady ta pamięć jest większa niż niezbędna na obsługę "liter w stringu". Dodawanie do niego kolejnych liter, nie powoduje alokacji nowej porcji danych. Dzieje się tak do momentu osiągnięcia wielkości docelowej (maksymalnej wielkości pamięci). Po dodaniu następnego znaku, następuje realokacja. Ilość pamięci jest zwiększana, następuje kopiowanie danych do nowej przestrzeni i przestawienie przestrzeni na nowy wskaźnik (w std::string na dane wskazuje *.data(). 

Tu opisałem (nie w pełni) jedną z możliwych polityk czyli sposobu obsługi tej alokacji. Popatrz jak wyglądają u Ciebie wyniki takiego prostego programu. Obserwuj jak wyglądają wyniki capacity(), size() oraz wartość adresu gdzie rezydują dane. Jeśli będziesz mógł, uruchom program na innym kompilatorze, OS.

#include <iostream>
#include <string>
#include <cstddef>
#include <iomanip>

void show_info(const std::string& str) {
    std::cout << std::dec << "capacity = " << str.capacity()
        << " size = " << str.size() << " data = "
        << std::hex << static_cast<const void *>(str.data()) << '\n';
}

int main() {
    std::string str;
    for(auto i = 0U; i < 128; i += 4) {
        str += ' ';
        show_info(str);
    }
}

 

Podobne pytania

0 głosów
1 odpowiedź 389 wizyt
pytanie zadane 27 sierpnia 2017 w C i C++ przez Virus_K Początkujący (280 p.)
0 głosów
2 odpowiedzi 803 wizyt
pytanie zadane 30 października 2018 w C i C++ przez Alan Kruszyński Obywatel (1,410 p.)
0 głosów
2 odpowiedzi 126 wizyt
pytanie zadane 28 kwietnia 2018 w C# przez Ilmefy Obywatel (1,950 p.)

92,555 zapytań

141,402 odpowiedzi

319,544 komentarzy

61,939 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...