#include<stdio.h>
int main()
{
int z; int **x; int *y;
x = (int **) malloc(sizeof(int*));
*x = malloc(sizeof(int));
**x = 5;
y = *x; //POINT 1
z = 3;
*x = &z;//POINT 2
printf("%d\n",*y);
printf("%d\n", **x);
**x = 2;
printf("%d\n",*y);
*y=1;
printf("%d\n",z);
}
我得到的输出如下
5 //为什么这5个?
3
5
2
我的问题是不应该是第一个输出打印3?为什么要打印5?
我的问题是这个程序是否会产生悬空参考或垃圾?我想这可能是这种意外输出的原因之一。有人可以解释一下。
答案 0 :(得分:4)
让我们把它画出来。
初始化x
,*x
和**x
后,您的记忆看起来像这样:
+---+ +----+ +---+ | x | --> | *x | --> | 5 | +---+ +----+ +---+
您指定y
:
+---+ +----+ | x | --> | *x | --\ +---+ +----+ \ +---+ >--> | 5 | +---+ / +---+ | y | --/ +---+
然后你在其他地方点*x
点,所以你有这个:
+---+ +----+ +---+ | x | --> | *x | --> | z | +---+ +----+ +---+ +---+ +---+ | y | --> | 5 | +---+ +---+
换句话说,您将y
指向*x
所指向的位置,而不指向*x
本身,因此当您更改*x
所指向的位置时,您不会; t改变y
指向的位置。
答案 1 :(得分:1)
x
指向指向内存位置的指针(例如p
)。您将值5
存储在该位置
y
指向指针p
指向的位置,值为5
的位置。
z
是一个值为3
的内存位置。
现在p
指向z
的内存位置。但是不会改变y
所指向的位置。因此,它仍然指向值为5
的位置。
答案 2 :(得分:1)
在你的程序中,你有y = *x;
,它将x指向的指针放入指针变量y。 x中指针指向的内存区域的值为5,因为y现在具有该指针,然后* y现在为5.然后将新指针放入指向x的指针区域。
int main()
{
int z; int **x; int *y;
x = (int **) malloc(sizeof(int*)); // create a pointer to a pointer variable
*x = malloc(sizeof(int)); // create a pointer to an int that is put into the pointer that is pointed to by x ( x -> int pointer -> int )
**x = 5; // set the int value pointed to by the pointer that is pointed to by x to 5
y = *x; //POINT 1 // assign the pointer to the int value to another pointer variable
z = 3;
*x = &z;//POINT 2 // assign a new address to the pointer that is pointed to by x.
printf("%d\n",*y); // print the value pointed to by y which is 5
printf("%d\n", **x); // print the value that is pointed to by the pointer which is pointed to by x which is 3
**x = 2;
printf("%d\n",*y);
*y=1;
printf("%d\n",z);
}