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

Wskaźnik na element stringa

0 głosów
385 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 (158,580 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 (158,580 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ź 678 wizyt
pytanie zadane 27 sierpnia 2017 w C i C++ przez Virus_K Początkujący (280 p.)
0 głosów
2 odpowiedzi 1,076 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 165 wizyt
pytanie zadane 28 kwietnia 2018 w C# przez Ilmefy Obywatel (1,950 p.)

93,424 zapytań

142,421 odpowiedzi

322,646 komentarzy

62,785 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

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
...