Page 1 of 1

Problema Libaj c, pointeri.

Posted: 16 Jan 2015, 21:08
by TARA24
Salutare tuturor,
sunt nou pe acest forum, la fel si in C (cca 2 luni).
Incerc sa creez un programel simplu in c si nu imi dau seama unde gresesc:
#include<stdio.h>
#define COMPARA 5

int *ptr_a, *ptr_b; // POINTERII *ptr_a si *ptr_b au valoarea 5 amandoi.

int functia_1(){
int a, b, c; // declaram 3 variabile
a = 10; // Variabila A primeste valoarea 10
b = 5; // Variabila B primeste valoarea 5
c = a - b; // Variabila C primeste valoarea rezultatului dintre a - b
ptr_a=&c; // Pointerul ptr_a ia valoarea lui C, adica 5

printf("Valorea pointerului \"A\" este:\t\t%d\n", *ptr_a); // Se printeaza valoarea 5
return *ptr_a; // Se da return la *ptr_a, care memoreaza valoarea 5
}

int functia_2(){
int d, e, f; // declaram 3 variabile
d = 2; // Variabila D primeste valoarea 2
e = 3; // Variabila E primeste valoarea 3
f = d + e; // Variabila F primeste valoarea rezultatului dintre D + E
ptr_b=&f; // Pointerul ptr_b ia valoarea lui F, adica 5
printf("Valorea pointerului \"B\" este:\t\t%d\n\n", *ptr_b); // Se printeaza valoarea 5
return *ptr_b; // Se da return la *ptr_b, care memoreaza valoarea 5
}

int calculeaza(){
int i;
i = 0;

for (i=0; i<1; i++)
if (*ptr_a == COMPARA && *ptr_b == COMPARA){
printf("Valoarea lui \"*ptr_a\" este egala cu Valoarea lui \"*ptr_b\":\n");
printf("\tValorea pointerului \"A\" este:\t\t%d\n", *ptr_a);
printf("\tValorea pointerului \"B\" este:\t\t%d\n\n", *ptr_b);
}else{
printf("\n\n\nValoarea lui \"*ptr_a\" nu este egala cu Valoarea lui \"*ptr_b\":\n");
printf("\tValorea pointerului \"A\" este:\t\t%d\n", *ptr_a);
printf("\tValorea pointerului \"B\" este:\t\t%d\n\n", *ptr_b);

}
return 0;
}

int main (){
functia_1();
functia_2();
calculeaza();
return 0;
}
Rezultatul:
Valorea pointerului "A" este: 5
Valorea pointerului "B" este: 5

Valoarea lui "*ptr_a" este egala cu Valoarea lui "*ptr_b":
Valorea pointerului "A" este: 5
Valorea pointerului "B" este: 5
programul dupa cum se observa ruleaza cu succes.
Acum, daca modific functia_1, din:
int functia_1(){
int a, b, c;
a = 10;
b = 5;
c = a - b;
ptr_a=&c;

printf("Valorea pointerului \"A\" este:\t\t%d\n", *ptr_a);
return *ptr_a;
}
in:
int functia_1(){
int a;
a = 5;
ptr_a=&a;

printf("Valorea pointerului \"A\" este:\t\t%d\n", *ptr_a);
return *ptr_a;
}
programul spune:
Valorea pointerului "A" este: 5
Valorea pointerului "B" este: 5




Valoarea lui "*ptr_a" nu este egala cu Valoarea lui "*ptr_b":
Valorea pointerului "A" este: 0
Valorea pointerului "B" este:
dupa cum se vede avem:
valoarea lui A 0 in loc de 5:
Valorea pointerului "A" este: 0
Intrebarea mea este de ce?
Multumesc.
Toate bune.

Re: Problema Libaj c, pointeri.

Posted: 18 Jan 2015, 11:31
by Ovidiu Cucu
Greseala care sare imediat in ochi e ca asignezi unor pointeri globali adresele unor variabile definite local, in functii. Dupa ce iesi din functii, Darcu stie ce mai e la adresele alea. Cu alte cuvinte am putea spune ca la iesirea din functii, variabilele locale "se distrug".
Increarca programelul simplu de mai jos si ai sa vezi ca in functia main, dupa apelul lui f1 si f2 nu se afiseaza ceea ce probabil te-ai fi asteptat.

Code: Select all

#include <stdio.h>

int *p1, *p2;

void f1()
{
    int i = 123;
    p1 = &i; /* p1 contine adresa pe stiva a variabilei locale i */
    printf("f1: p1 pointeaza la valoarea %d\n", *p1);
}

void f2()
{
    int i = 456;
    p2 = &i; /* p2 contine adresa pe stiva a variabilei locale i */
    printf("f2: p2 pointeaza la valoarea %d\n", *p2);
}

int main()
{
    f1();
    f2();
    /* Darcu stie ce mai e la adresa pe care o contine p1 */
    printf("main: p1 pointeaza la valoarea %d\n", *p1);
    /* idem */
    printf("main: p2 pointeaza la valoarea %d\n", *p2);
	return 0;
}

Re: Problema Libaj c, pointeri.

Posted: 19 Jan 2015, 15:39
by TARA24
Multumesc mult de raspuns,
acum am sa te rog din nou sa te uiti inca odata la intrebarea mea. Ea era legata de ce:
int functia_1(){
int a, b, c;
a = 10;
b = 5;
c = a - b;
ptr_a=&c;

printf("Valorea pointerului \"A\" este:\t\t%d\n", *ptr_a);
return *ptr_a;
}
Ruleaza si
int functia_1(){
int a;
a = 5;
ptr_a=&a;

printf("Valorea pointerului \"A\" este:\t\t%d\n", *ptr_a);
return *ptr_a;
}
nu ruleaza,
care este diferenta dintre:
int a, b, c;
a = 10;
b = 5;
c = a - b;
ptr_a=&c;
si
int a;
a = 5;
ptr_a=&a;
Nu ar trebui sa fie acelasi lucru? daca nu, imi explici te rog diferenta. Asta era intrebarea mea defapt.
Multumesc

Re: Problema Libaj c, pointeri.

Posted: 19 Jan 2015, 18:39
by bu7ch3r
Explicatia de mai jos nu e chiar "academica", dar link-ul atasat ar trebui sa te lumineze.
int a ala se numeste variabila automata - compilatorul iti garanteaza consistenta ei doar atat timp cat variabila e in scop(adik e incadrata de prima paranteza acolada dinaintea declararii si sora ei de mai tarziu)

Code: Select all

{
int a;
}
Cand programul tau da de "}" se apuca de facut curat si sterge/sau nu variabilele automate.

Ar fi inutil sa-ti explic acum cum e cu memoria si cum se sterge sau nu se sterge ea si ca are doua stari: free,used si available:)(de asta e mai sus un "sau nu" - stersul asta e ciudat tare pentru unii cand e vorba de memorie)

Cel mai simplu si mai simplu e sa citesti aici: http://en.wikipedia.org/wiki/Dangling_pointer, aici e explicat de ce si mai ales de ce nu(e bun).

L.E.
Dar ca sa-ti raspund la intrebare: De ce?
Cand faci ce ai facut tu in codul tau, compotamentul programului e ambiguu. Adica poate merge, poate nu merge, totul depinde de cum a facut compilatorul la compilare sau ce face programul la rulare.
Totusi daca ai studia compilatoare sau asambler sau mai stiu eu ce chestii low-level ai putea afla exact de ce. Nu e chiar de asa alan-dala fata de cum incerc eu sa prezint lucrurile.

Re: Problema Libaj c, pointeri.

Posted: 21 Jan 2015, 21:51
by TARA24
Multumesc de clarificare.
Toate bune.