Eh sada dolazimo do onog drugog dela kako je smesten C program u memoriji, i sasvim je moguce da ce ti program raditi iako sam toga nisi svestan zasto radi. Naime svaki proces(program koji se izvrsava ) se satoji iz vise sekcija, na dnu se nalazi text sekcija, zatim nakon toga se nalazi inicializovane(konstante) promenjive, a iznad se nalaze neinicijalicovane promenjljive. Ostali deo memorije je podeljen na dva dela heap(dinamicki alocirana memorija) koji se "puni" sa doljnje strane i stack koji se "puni" sa gornje.
Za detaljnije oko svega ovoga procitaj clanak koji se bavi pisanjem exploita, za buferowerflow, ali su pre svega detaljno opisali gde i kako stoje stvari u memoriji.
A sada da se vratimo zasto je to jednako, pa pre svega "tcx" je jedna inicijalizovana bezimena promenljiva, sada sto se pojavila vise puta kompajler je bio pametan pa je vise "tcx" promenljivih smetio kao jednu te istu u vreme kompajliranja. naravno da "tcx1" ne prolazi kao jednaka sa "tcx" jer kompajler nije mogao da unifikuje "tcx" i "tcx1". Ujedno razlog zasto ti ne prolazi argv[1] jer je ona neinicijalizovana( ne\ije poznata njena vrednost u vreme izvrsavanja).
Opet ako si i dalje neverni toma, napisi jedan
Code:
printf("pokazivac a[1] okazuje na %p pokazivac b[1] pokazuje na %p\n",a[1],b[1]);
%p treba da ti da ti ispise adresu na koju pokazuje a[1] i b[1]. E sada ukoliko sve to probas na nekom UNIX-u iskoristi komandu size <izvrsni fajl> pa pogledaj sekciju data(konstante) i videces da u slucaju kada bi trebalo da koristis isti "tcx" biti manja za 5 bajtova nego u slucaju da b[1] pokazuje na "tcx1"
Jos malko teorije text i data su read only, tako da u slucaju da probas da uradis nesto oavko
Code:
a[1][1]='d';
dobices Seg. Fault.
Toliko o tome.
Pozdrav
PS Cela ova prica je neka vrste opste programerske kulture, tako da me cudi da su se moderatori "malko" obrukali :), no sve je za ljude
;)