Problema Libaj c, pointeri.

Acest forum este dedicat intrebarilor de programare care nu-si au locul in unul din celelalte forumuri
Post Reply
TARA24
Junior
Junior
Posts: 3
Joined: 16 Jan 2015, 20:59

Problema Libaj c, pointeri.

Post by TARA24 » 16 Jan 2015, 21:08

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.



User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3778
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: Problema Libaj c, pointeri.

Post by Ovidiu Cucu » 18 Jan 2015, 11:31

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;
}

TARA24
Junior
Junior
Posts: 3
Joined: 16 Jan 2015, 20:59

Re: Problema Libaj c, pointeri.

Post by TARA24 » 19 Jan 2015, 15:39

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

User avatar
bu7ch3r
Membru++
Membru++
Posts: 326
Joined: 17 May 2011, 15:17
Judet: Iaşi
Location: Sofia
Contact:

Re: Problema Libaj c, pointeri.

Post by bu7ch3r » 19 Jan 2015, 18:39

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.
Cu stima,
Lupu Claudiu

TARA24
Junior
Junior
Posts: 3
Joined: 16 Jan 2015, 20:59

Re: Problema Libaj c, pointeri.

Post by TARA24 » 21 Jan 2015, 21:51

Multumesc de clarificare.
Toate bune.

Post Reply