Jump to content
ionut.hulub

Medium C challange

Recommended Posts

Posted (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 by NemesisITSC
Posted

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.

Posted

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?

Posted

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".

Posted

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.

Posted

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.

Posted (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) = 16

La 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 by alien

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



×
×
  • Create New...