String jako char od kuchni

0

Hej,
oto kod:

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?

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ć.

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:

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ź !!

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]

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...
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?

1 użytkowników online, w tym zalogowanych: 0, gości: 1