17.04.2013 Views

Florian Moraru PROGRAMAREA CALCULATOARELOR în limbajul C

Florian Moraru PROGRAMAREA CALCULATOARELOR în limbajul C

Florian Moraru PROGRAMAREA CALCULATOARELOR în limbajul C

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

char * file; // pointer neinitializat, nu se aloca memorie<br />

O versiune mai sigurã si cu mai putine argumente ar folosi alocarea dinamicã de<br />

memorie pentru noul nume de fisier creat de functie:<br />

char* modext (char* oldfile, char *ext) {<br />

char * p, *newfile;<br />

newfile = (char*) calloc (strlen(oldfile) + strlen(ext)+1,1); // aloca memorie<br />

strcpy(newfile,oldfile); // copiaza vechiul nume<br />

p =strrchr(newfile,'.'); // cauta pozitia ultimului punct din nume<br />

if (p != NULL) // daca exista o extensie<br />

*p=0; // elimina extensia veche din nume<br />

strcat( strcat(newfile,"."),ext); // atunci se adauga extensia "ext"<br />

return newfile; // rezultatul functiei<br />

}<br />

In general nu se scriu functii care sã aloce memorie fãrã sã o elibereze, deoarece<br />

apelarea repetatã a unor astfel de functii poate duce la consum inutil de memorie. Nici<br />

nu este bine ca eliberarea memoriei alocate sã revinã celui care apeleazã functia.<br />

O solutie <strong>în</strong>selãtoare este utilizarea unui vector local cu dimensiune constantã:<br />

char* modext (char* oldfile, char *ext) {<br />

char * p, newfile[80];<br />

strcpy(newfile,oldfile); // copiaza vechiul nume<br />

. . . }<br />

In general nu se recomandã functii care au ca rezultat adresa unei variabile locale,<br />

desi erorile de utilizare a unor astfel de functii apar numai la apeluri succesive (<strong>în</strong><br />

cascadã) de functii cu variabile locale. Exemplu:<br />

// extrage un subsir de lungime n de la adresa s<br />

char * substr (char* s, int n) {<br />

char aux[1000]; // o variabila locala pentru subsirul rezultat<br />

int m;<br />

m=strlen(s); // cate caractere mai sunt la adresa s<br />

if (n>m) n=m;<br />

strncpy(aux,s,n);<br />

aux[n]=0; // terminator de (sub)sir<br />

return aux; // pointer la o variabila locala !<br />

}<br />

// verificare functie<br />

int main () {<br />

puts (substr("abcdef",3)); // corect: abc<br />

puts (substr (substr("abcdef",4),2)); // corect sau nu, functie de<br />

implementare<br />

}

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!