ionut.hulub Posted February 21, 2012 Report Posted February 21, 2012 Se da codul:typedef struct myStruct{ char a, b; int x; char c; double db; short s[3]; int z;} myStruct;myStruct grup;printf("%d", sizeof(grup));ce afiseaza? Quote
Johane Posted February 22, 2012 Report Posted February 22, 2012 Ne ruland codul cred ca o sa ne afiseze cata memorie o sa ocupe acea structura Quote
nedo Posted February 22, 2012 Report Posted February 22, 2012 Pentru un system pe 32 de biti presupunem ca db ocupa 4 bytes;sizeof(group) va afisa marimea lui db x fiecare variabila din struct, pentru short[3] fiecare valoarea va avea tot marimea de 4 bytes.Deci pentru aceasta marime am avea 36. Quote
ionut.hulub Posted February 22, 2012 Author Report Posted February 22, 2012 db e pe 8 octeti. inca astept rasp. Quote
nedo Posted February 22, 2012 Report Posted February 22, 2012 daca e pe 8 octeti atunci rezultatul este 8 x 9, 72.Intr-un struct, toate variabilele ocupa cat cea mai mare variabila. Quote
FreddieTux Posted February 22, 2012 Report Posted February 22, 2012 E interesanta problema. Daca le adunam pe toate, obtinem 25, dar programul va returna 32. Habar n-am de unde a adaugat 7 octeti. Singura explicatie pe care o am e asemanatoare cu cea a lui nedo, doar ca fiecare tip va ocupa 8 octeti. Adica 3*char = 3, adaugam 5 si obtinem 8, 3*short = 6, adaugam 2 si obtinem 8, 2*int = 8 si nu mai adaugam nimic. Deja vedem ca trebuie sa adaugam 5+2 = 7 si ajungem la 32. Oricum, e doar o speculatie, nu stiu raspunsul Quote
nedo Posted February 22, 2012 Report Posted February 22, 2012 Mdea, se pare ca aberez, raspunsul meu e gresit, dar nu inteleg de ce. Quote
against_modern_football Posted February 22, 2012 Report Posted February 22, 2012 (edited) afiseaza 40. Dar adunate de mine dau 2+2+1+8+8+2=23. Acum sa vedem de ceLE: E din cauza felului in care sunt asezate variabilele pe stack. Aparent, nu sunt una dupa alta ci cu spatii de memorie intre ele. Spatiul asta difera si el se pare. Edited February 22, 2012 by against_modern_football Quote
ionut.hulub Posted February 22, 2012 Author Report Posted February 22, 2012 (edited) LE: E din cauza felului in care sunt asezate variabilele pe stack. Aparent, nu sunt una dupa alta ci cu spatii de memorie intre ele. Spatiul asta difera si el se pare.intradevar e din cauza la cum sunt asezate in memorie.char'ul este pe 1 byte, si primele 2 charuri vor ocupa 2 bytes. sa zicem ca o sa le plaseze incapand de la zona de memorie 100 pana la 102.logic ar fi ca urmatorul int sa ocupe de la 102 pana la 106, dar int'ul, ocupand 4 bytes, trebuie sa place de la o zona de memorie divizibila cu 4, asa ca la compilare se va lasa un offset de 2 bytes dupa char-uri, si intul o sa inceapa sa fie scris in memoria incepand cu zona 104.o sa se mai lase un offset de 3 bytes dupa char c, unul de 2 bytes dupa short s[3]programul o sa afiseze 32.PS.daca vreti sa intelegi mai bine cum sta treaba, creati voi nistre structuri si afisati adresa fiecarul element ca sa vedeti cum sunt pozitionate in memorie. Edited February 22, 2012 by NemesisITSC Quote
against_modern_football Posted February 22, 2012 Report Posted February 22, 2012 @NemesisTSC : depinde de arhitectura. Mie imi afiseaza 40. Dar sunt pe x64 Quote
ionut.hulub Posted February 22, 2012 Author Report Posted February 22, 2012 @NemesisTSC : depinde de arhitectura. Mie imi afiseaza 40. Dar sunt pe x64se acord.depinde atat de arhitectura cat si de compilator, dar pentru cei mai multi programatori charu e pe 1 byte, short pe 2, int pe 4 si double pe 8. Quote
ionut.hulub Posted February 22, 2012 Author Report Posted February 22, 2012 daca e pe 8 octeti atunci rezultatul este 8 x 9, 72.Intr-un struct, toate variabilele ocupa cat cea mai mare variabila.cred ca faci o confuzie.probabil te gandesti la un union, structura in care toate variabilele impart aceeasi zone de memorie, egala cu dimensiunea celei mai mari variabile. Quote
against_modern_football Posted February 22, 2012 Report Posted February 22, 2012 @ NemesisTSC: dimensiunea variabilelor e fixa indiferent de compilator. Din ce citesc acum difera doar zona de memorie adaugata. Oricum e de retinut ca se adauga ceva Quote
nedo Posted February 22, 2012 Report Posted February 22, 2012 am facut mici experimente inainte sa dau raspunsul respectiv, cu structuri cu cate 2-3 membri si de acolo am ajuns la concluzia respectiva. AM citit apoi despre offsets si despre cum sunt stocate im memorie variabilele intr-un struct si am inteles de ce da 40 in cazul meu(x64) si 32 pe x86.Guess there still is a lot for me to learn ....We keep going. Quote