ionut.hulub Posted February 12, 2012 Report Posted February 12, 2012 (edited) Se da codul:void fct(char s[256], int i) { int y; int contor = 0; for (y = i; y < strlen(s) + i; y++) s[y] = s[contor++];}int main() { int i; char sir[17] = "SimpleCChallange"; for (i = 0; i < strlen(sir); i++); fct(sir, i); printf("%s", sir); return 0;}Da sau nu eroare? Daca da eroare, ce eroare? Daca nu da eroare, ce afiseaza? Edited February 12, 2012 by NemesisITSC Quote
alien Posted February 12, 2012 Report Posted February 12, 2012 Nu l-am rulat, dar presupun ca va da eroare de outofbounds pe char s[256], deoarece for-ul este infinit, avand conditia de oprire strlen(s) care se modifica la fiecare iteratie. Quote
Nytro Posted February 13, 2012 Report Posted February 13, 2012 char sir[17] = "SimpleCChallange"; - Asta e const char *void fct(char s[256], int i) { - Aici e char *Nu se poate apela functia, nu se face conversia implicit. Quote
ionut.hulub Posted February 13, 2012 Author Report Posted February 13, 2012 raspunsul lui Nytro este corect.Modifi putin datele problemei:void fct(char s[256], int i) { int y; int contor = 0; for (y = i; y < strlen(s) + i; y++) s[y] = s[contor++];}int main() { int i; char sir[17]; strcpy(sir, "SimpleCChallange"); for (i = 0; i < strlen(sir); i++); fct(sir, i); printf("%s", sir); return 0;}acum? Quote
Starker Posted February 13, 2012 Report Posted February 13, 2012 Fara erori, dar nu o sa dea nimic bun din cauza acelui + i din void fct si cred ca vor fi warning-uri la for-uri. Bafta ! Quote
ionut.hulub Posted February 13, 2012 Author Report Posted February 13, 2012 Raspuns gresit.Sa vorbim putin despre cum aloca calculatorul memoria in functia void fct(char s[256], int i);Vedem ca primul argument este char s[256] si probabil va asteptati sa aloce 256*sizeof(char) adica 256 de octeti, dar defapt, aia este memoria MAXIMA care ii este permis sa o aloce. Memoria care o va aloca la fiecare rulare a functiei depinde de ce argument ii este trimis. In cazut nostru, ii este trimis un vector ce 17 caractere (16 din sir si '\0' pentru sfarsit de sir), deci va aloca doar 17*sizeof(char) => la a doua iteratie a forului va incepe sa scrie intr'o zona de memorie care nu ii este alocata vectorului, si va suprascrie adresa instructiunii la care trebuie sa se intoarca programul dupa ce termina de rulat functia, ceea ce va genera o eroare de tip "buffer overflow". Quote
Nytro Posted February 13, 2012 Report Posted February 13, 2012 Fals. Nu se aloca nimic pentru acel s[256], e un pointer si se vor pune pe stiva 4 octeti (respectiv 8 pentru sisteme pe 64 de biti) indiferent daca e s[1] sau s[1337]. Ii este trimis un pointer la un sir de caractere deja alocat. Practic va copia sirul "dupa" sirul existent (in memorie). Revin cu detalii mai tarziu. Quote
Starker Posted February 13, 2012 Report Posted February 13, 2012 Lucrez in MinGW. Pointer e cu *. Posibil sa fi facut eu confuzie de semne. Nytro astept sa ma lamuresti. Bafta ! Quote
Nytro Posted February 13, 2012 Report Posted February 13, 2012 In C un vector e un pointer, adresa de memorie contigua unde e memorat acel vector.Ex. char plm[13] = "Ana are mere";plm == 0x12345678, adresa de unde incepe acel sir, adica la adresa 0x12345678 e caracterul "A", adica 65, adresa 0x12345679 corespunde lui "n" si tot asa. Tipul de date al vectorului, char, indica faptul ca fiecare element ocupa un octet pentru ca sizeof(char) este 1. Quote
alien Posted February 13, 2012 Report Posted February 13, 2012 (edited) Si totusi raman la ce am afirmat mai sus.for (y = i; y < strlen(s) + i; y++) s[y] = s[contor++];Initial s = "SimpleCChallange"strlen(s) = 16La urmatoarea iteratie:s="SimpleCChallangeS"strlen(s)=17....For-ul merge pana la infinit.LE: faine challenge-uri si C-ul e limbajul cel mai potrivit, are o gramada de reguli Edited February 13, 2012 by alien Quote