Program:Wskaźniki i alokacji pamięci w C
int x;
int *y;
int **z;
z = (int **) malloc (sizeof(int *));
y = (int *) malloc (sizeof(int));
x = 1;
*z = &x;
*y = x;
.
.
.
Pytanie: Jaka jest różnica między:
*z = &x;
*y = x;
z tego co rozumiem * Z wskazuje na adres xi * y punktów do x, ale dla * y do wskazania x nie wymaga adresu x? Naprawdę nie rozumiem, co się dzieje z tymi dwoma zmiennymi.
Edycja: Chcę również wiedzieć, kiedy wiemy, kiedy zmienna jest przydzielana na stosie lub na stercie?
- Dlaczego na stosie są przydzielane x, yi z?
- Dlaczego wartości * y, ** y, * z, ** z są przydzielane do sterty?
Wreszcie zmienia się * z, zmień ** z?
"Z tego co rozumiem ..." Nie rozumiesz. z i y nadal wskazują dowolny blok pamięci, na który wskazywali, kiedy je przydzieliliście. –
Nie należy rzutować wartości zwracanej przez 'malloc()' w C. Pomoże to zidentyfikować błąd braku prototypu dla niego. – jxh
Przede wszystkim musisz zrozumieć, że te dwa ostatnie stwierdzenia są całkowicie różne. Pierwszy przypisuje * adres * x do dowolnych punktów z, podczas gdy drugi przydziela * wartość * x do dowolnego punktu y. Jeśli przypiszesz wartość, to oryginał i kopia staną się "rozłączone", tak że zmiana jednego nie zmieni drugiego. Ale kiedy użyjesz tylko adresu, te dwie są połączone przy biodrze - zmień je i zmień drugie. –