String jako char od kuchni

String jako char od kuchni
Marek Budziński
  • Rejestracja:około 5 lat
  • Ostatnio:około 5 lat
  • Postów:3
0

Hej,
oto kod:

Kopiuj
int main (void)
{
    string s = "Marek";
    printf("String %c, %c, %c, %c, %c \n", s[4], s[5], s[7], s[8], s[9]);
    printf("Nazwa: %s\n", s);
}

screenshot-20200415212210.png

Rozumiem, że s[5] to "\0", skąd się zatem biorą wartości dla s[7], s[8], s[9] itp?

edytowany 1x, ostatnio: Marek Budziński
AK
Śmieci, wartość przypadkowa
AK
Jeśli to świczenie szkolne, to jest złe ćwiczenie
kq
Moderator C/C++
  • Rejestracja:prawie 12 lat
  • Ostatnio:około 16 godzin
  • Lokalizacja:Szczecin
3

Śmieci w pamięci. Bardziej formalnie, to co robisz to UB i ma prawo zdarzyć się wszystko. Włącznie z RCE albo formatem dysku twardego, choć w tym przypadku ciężko to sobie wyobrazić.


Sunnydev
hehe. rekursywne usuwanie zawartości System32 intensifies :D wierzę, że to może się zdarzyć, ale dude, kara jakich mało.
kq
Jak masz RCE bo wczytałeś za duży bufor z socketa to wtedy wszystko zależy od dobrej woli adwersarza :​)
Marek Budziński
  • Rejestracja:około 5 lat
  • Ostatnio:około 5 lat
  • Postów:3
0

Wykład online zatytułowany - "memory", a że mnie zawsze ciekawi więcej niż mówią, to się równolegle z wykładem bawię. Śmieci - załóżmy, że na tym poziomie mi to wystarczy, aczkolwiek - skąd niby te śmieci się biorą? Cała pamięć, każdy bajt jest takimi śmieciami zapełniony (coś na zasadzie - natura nie znosi próżni?), od razu kolejne pytanie mi się nasunęło:

Kopiuj
int main (void)
{

    string s = "Marek";
    printf("String %c, %c, %c, %c, %c \n", s[4], s[5], s[7], s[8], s[9]);
    printf("Nazwa: %s\n", s);
    printf("Lećmy dalej: %p\n", &s);
    printf("Kolejny: %p, %p,\n", &s[0], &s[1]);
}

screenshot-20200415213331.png

s[0] jest początkiem mojego stringa, s[1] jest logicznie - kolejnym bajtem stringa w pamięci i widać to po adresie hex, dlaczego zatem "&s" nie podaje wartości od której mój string się zaczyna, tylko zupełnie inną? Ma to jakieś proste wytłumaczenie, czy może specyfika pamięci/kompów i nie warto na moim poziomie zawracać sobie tym głowy?

PS. Dziękuję za szybką pomoc i odpowiedź !!

kq
Moderator C/C++
  • Rejestracja:prawie 12 lat
  • Ostatnio:około 16 godzin
  • Lokalizacja:Szczecin
4

Coś w tej pamięci było wcześniej. Może inny program, może jakiś obiekt z tego programu. Kto wie. Koszt czyszczenia jest niezerowy, a z założenia pierw do obiektów coś przypisujesz zanim z nich czytasz, więc nie ma co się martwić o takie sytuacje.

string jest klasą, jak chcesz adres pierwszego elementu, a nie obiektu klasy, to użyj &s[0]


edytowany 1x, ostatnio: kq
AK
  • Rejestracja:prawie 7 lat
  • Ostatnio:około miesiąc
  • Postów:3561
1
Marek Budziński napisał(a):

Wykład online zatytułowany - "memory", a że mnie zawsze ciekawi więcej niż mówią, to się równolegle z wykładem bawię. Śmieci - załóżmy, że na tym poziomie mi to wystarczy, aczkolwiek - skąd niby te śmieci się biorą? Cała pamięć, każdy bajt jest takimi śmieciami zapełniony (coś na zasadzie - natura nie znosi próżni?), od razu kolejne pytanie mi się nasunęło:

...

s[0] jest początkiem mojego stringa, s[1] jest logicznie - kolejnym bajtem stringa w pamięci i widać to po adresie hex, dlaczego zatem "&s" nie podaje wartości od której mój string się zaczyna, tylko zupełnie inną? Ma to jakieś proste wytłumaczenie, czy może specyfika pamięci/kompów i nie warto na moim poziomie zawracać sobie tym głowy?

PS. Dziękuję za szybką pomoc i odpowiedź !!

  1. Z ciekawych zabaw w tym zakresie, to Ci podrzucę:
    adres obiektu string i literek ze stringa, dla stringu bardzo małego (<4) i duzego. Bardzo mgliście kojarzę, może coś mylę, że malutkie stringi są/bywały upychane "in-place", a duże alokowane. WIęc gdyby tak było, dla malutkich byłyby to podobne adresy, i odległe dla przeciwnego przypadku.

  2. Zdecudyj się na język.

  • Do latania po adresach C jest bardziej adekwatny.
  • w C++ co do pamięci można zgłębić wszystkie opcje operatora new, Alokatorów itd...

Bo C to najlepszy język, każdy uczeń ci to powie
kq
SSO jest opcją, nie wymaganiem. fbString chyba do 23 znaków upycha.
Marek Budziński
  • Rejestracja:około 5 lat
  • Ostatnio:około 5 lat
  • Postów:3
1
AnyKtokolwiek napisał(a):
  1. Zdecudyj się na język.
  • Do latania po adresach C jest bardziej adekwatny.
  • w C++ co do pamięci można zgłębić wszystkie opcje operatora new, Alokatorów itd...

Jestem samoukiem, zdecydowałem się dokończyć kurs CS50, gdyż prowadzący ciekawie i dość przejrzyście tłumaczy pojęcia jak bity, bajty, zmienne, takiemu laikowi jak ja. Jestem w połowie :D (to oznaka dumy), skończę zrobię kolejny kurs z C++, potem kolejny z Pythona, potem kolejny ze SQLa, potem zrobię pętlę raz jeszcze, i dopiero mając takie podstawy zacznę myśleć o ?sepcjalizacji?

A skoro już o tym rozmawiamy - osobiście mam wykształcenie matematyczne, ale z programowaniem jw. zaczynam przygodę - kurs 1,5 godzinny oglądam w 6 godzin co chwila googlując nowe pojęcia, które póki co są dla mnie intuicyjne, a nie "wykute", zrozumiałe bez zająknięcia.

Docelowo - chciałbym popracować trochę w korpo zdobyć doświadczenie, a za kilka lat mieć możliwość pracy zdalnej (to jest mój główny cel). Jakieś może wskazówki co do tego planu?

AK
Java (z frameworkami), C# (z frameworkami), SQL tak

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.