dlugosc tablicy w pamieci

0

Mając tablice

  char c [] = "qwertyu asdfgh zxcvbn";

// wypisujac ja w ten sposob 

cout << c;
// otrzymamy: qwertyu asdfgh zxcvbn
//tworzy sie niejawane rzutowanie na pierwszy element czyli &c[0] 

to skąd dokładnie program/kompilator wie gdzie kończy się dany ciąg, jest jakaś wartość reprezentująca dluogosc przekazywana?

0

Podczas działania programu można się dowiedzieć jaka jest długość ciągu znaków, ponieważ ostatni znak jest znakiem zero ('\0'). Jak np. nadpiszesz tam (na ostatniej pozycji) inną wartość to podczas wypisywania cout zacznie wyrzucać dane które są na dalszej pozycji w pamięci ("śmieci").

0

w tablicy intow, tez jest taki null bajt?

0

pisze aż do napotkania \0, gdy zdefiniujesz tablice o rozmiarze pomijającym znak \0 program bedzie pisał dalej.

0

allocer, to co jest przekazywane/ skąd wie gdzie kończy się tablica int?

0
czestl napisał(a)

allocer, to co jest przekazywane/ skąd wie gdzie kończy się tablica int?

Nie wie.

0

Przecież int ma zdefiniowany rozmiar ;]

0
czestl napisał(a)

w tablicy intow, tez jest taki null bajt?

Nie. Zresztą ten null nie jest częścią tablicy, a literału:

napis "qwertyu asdfgh zxcvbn" tak naprawdę oznacza "qwertyu asdfgh zxcvbn\0"
czyli bajt \0 doklejany jest do twojego napisu, a nie jakoś magicznie dodawany do tablicy przy każdej operacji.

0

to jeszcze z tymi tablicami intow, to on nie wie kiedy sie konczy i liczby, ze programista bedzie wiedzial zeby nie przekraczac tej wartosci?

bo majac

 int tab[2]
// mozna odwolac sie do 3 czy 4 czy tam 20elementu tej tablicy 
0

Tak. C++ dzieki temu jest szybszy od innych języków bo nie sprawdza takich rzeczy.

0
czestl napisał(a)

to jeszcze z tymi tablicami intow, to on nie wie kiedy sie konczy i liczby, ze programista bedzie wiedzial zeby nie przekraczac tej wartosci?

bo majac

 int tab[2]
// mozna odwolac sie do 3 czy 4 czy tam 20elementu tej tablicy 

Nie wie i niby po co miałby, ty deklarując tablicę statyczną, czy alokując pamięć posiadasz dokładną wiedzę o rozmiarze tablicy (chyba, że jesteś programistą schizofrenikiem z rozdwojeniem jaźni i obaj piszecie na zmianę po linijce kodu).

W c nie przewidziano wewnętrznej sterty i zarządzania pamięcią, jak to było w pascalu. Pamięć dostajesz od systemu bezpośrednio, zaś do zwolnienia (zwrócenia systemowi) potrzebny jest tylko adres obszaru.

Shalom napisał(a)

Tak. C++ dzieki temu jest szybszy od innych języków bo nie sprawdza takich rzeczy.

J.w. pascal niewiele ustepuje c pod tym względem a ma/miał zarządzanie wewnętrzne stertą i można było dokładnie określić przydzielone rozmiary, segmentację sterty, i inne parametry, ba, można było robic jeszcze ciekawsze rzeczy: przykład.

0

Póki operujemy na tablicach statycznych, nie ma konieczności pamiętania rozmiaru tablicy: w tym może nas wyręczyć stosowne makro:

#define arraysize(x) (sizeof(x)/sizeof(*x))

lub (c++) funkcja szablonowa:

template <typename T,size_t N>
size_t arraysize(T(&a)[N])
{
	return N;
}

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