Zdravim, resim takovou celkem zacatecnickou otazku:
Docetl sem se, ze do promenne "prom"
char prom[10];
muzu ukladat maximalne 10 znaku.
Ja jsem to ale zkousel "pretizit" a program mi fungoval i kdyz jsem do "prom" vlozil 12, 15 i vice znaku..
Samozrejme to nefungovalo do nekonecna, jen me zajima, kde je ta skutecna hranice a proc vlastne existuje takove volne misto..
A predpokladam, ze i kdyz to jde, tak to neni dobre, vkladat vice znaku, nez je limit, ze ..
Dik.
Fórum › C / C++
CHAR
ne neni to dobre. Jediná chyba je v tom, že si to nekontroluje, kde zapisuje.
skus:
char pole1[10];
char pole2[200];
for (int i = 0;i < 20;i++)
pole1[i] = char(65+i);
cout << pole1 << endl;
cout << pole2 << endl;
neskušal som to, napište niekto čo to robi :)
To mephi :
Nejdrive mi to vyhodilo 4 chyby, tak jsem to spustil znovu, zase je to vyhodilo a kdyz jsem to spustil potreti (beze zmen), tak mi to jelo bez problemu..
Cely program vypadal takhle:
#include <iostream>
using namespace std;
int main()
{
char pole1[10];
char pole2[200];
for (int i = 0;i < 20;i++)
pole1[i] = char(65+i);
cout << pole1 << endl;
cout << pole2 << endl;
cout <<"Funguje. ";
cin.get();
return 0;
}
Vypise to "ABCDEFGHIJKLMNOPQRST", pak smajlik, pak hromadu stejnych znaku (snad ╠) a pak zase "ABCDEFGHIJKLMNOPQRST", a smajlik, takze se tvari, ze s tim nema problemy.. Nevim, nechapu.
Jeyekomon
Docetl sem se, ze do promenne "prom" char prom[10]; muzu ukladat maximalne 10 znaku.
Správně
Ja jsem to ale zkousel "pretizit" a program mi fungoval i kdyz jsem do "prom" vlozil 12, 15 i vice znaku..
Musíš si vzít, že paměť se přiděluje po úsecích. Tvoje char prom[10] potřebuje místo 80bitů. Ale jelikož počítač pracuje v dvojkové soustavě, nejbližší mocnina dvojky, do které se 80 vejde, je 128. Kernel navíc, aby se nemusel pořád hrabat v paměti, přideluje místo po větších úsecích. Nakonec tedy dostaneš mnohem větší místo než potřebuješ.
Ale pozor. Mezi kernelem většinou ještě bývá další vrstva, která se stará o spolupráci tvého programu tvého programu s kernelem. Která si může požádat o místo do zásoby, přičemž ti ho pak přiděluje sama. Takže když se budeš pokoušet takhle zapisovat do paměti, můžeš si přepsat vlastní data.
... tohle neni prilis chytre. kdyz v c/c++ ukladas do pole, vezme se adresa prvniho prvku, ke ktere se pricte index: tzn. je-li c[0] na adrese 0xaaaaaa, a jeden prvek c ma jeden byte, pak c[2] bude na adrese 0xaaaaac. jde o to ze kompilator obecne predpoklada ze vis co delas. on nema proste v pameti napsano: tohle je pole c, tohle je promenna a... pri vytvoreni int c[10] ti zaruci ze bude k dispozici 10 intu na souvislych pozicich pocinaje c[0]. to co je v pameti za polem uz neresi. muze tam byt volna pamet, muze tam byt pamet kterou nikdo nevyuziva. proto ti ten program nekdy spadl (tvuj OS ho odstrelil za pokus o pristup na chranenou pamet), nekdy fungoval... a vypisoval "divne znaky" - to byly hodnoty ktere v pameti byly predtim a pocitaci prislo zbytecne je vymazat. c je jazyk kde muzes delat co chces, neni to pascal kterej ti nic nedovoli... to ze muzes delat co chces znamena ze pokud nevis co delas muze se stat cokoli... nastesti i windows pokrocil a nemuze se ti stat (vetsinou) ze si shodis celej os i takhle trivialnim programkem.
kdyz si v priklade deklaroval dve pole, je celkem caste ze se pamet pro ne alokuje po sobe... proto kdyz pises jakoby do prvniho pole, pises ve skutecnosti do druheho... ale tohohle se v programovani vyvaruj, je to podobna prasarna jako prepisovat hodnoty konstant po jejich inicializaci (ano, jde to, ale aspon si tim neshodis program))
nastesti i windows pokrocil a nemuze se ti stat (vetsinou) ze si shodis celej os i takhle trivialnim programkem.
To sa nemoze stat v ziadnom os ktory pracuje v protected rezime a pouziva virtualnu pamat (cize vsetky dnesne os). Nestras tu ludi ;)
Ak tu uz niekto povedal, sem-tam ti to funguje lebo pamat sa alokuje po strankach (4kB pod linuxom sa mi zda, pod Win nemam sajnu). To ze sa ti k tomu popriraduju premenne ktore mozes potom od-free()-ovat je vec kompileru a memory manageru, ktory je sucast clib.
Ak je to staticke, tak v binarke su sekcie(data, bss, text) tiez zarovnane na stranky.
To tmi :
Zatim ne, na kazdem rohu jsou totiz reklamy na novy Windows, ale nezasveceny uzivatel se toho moc o jinych systemech (Unix, Linux) moc nedovi.
Pokud bych vedel, kde se o tom dovedet vic, tak bych mozna mel zajem.
To tmi : Win98 je sice iba graficky dos ale aby si takto primitivny program prepisoval pamat v kernel-space je silna kava aj na produkty Mrkvosoftu, imho ;) Ale mozno ich precenujem... ;)
To Jeyekomon : linuxos.sk, root.cz, linuxsoft.cz, http://www.linux.org/lessons/ (anglicky). Len, prosim ta, neskonci pri *ubuntu.
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
Char vo for — založil Rastislav Cupa
Funkce char — založil Fičak
Strig to Char? — založil exim
Const char v C — založil Halancik
Moderátoři diskuze