来自测试程序的意外输出,带有指针和C中的间接级别

时间:2014-10-18 21:03:45

标签: c pointers

#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?

我的问题是这个程序是否会产生悬空参考或垃圾?我想这可能是这种意外输出的原因之一。有人可以解释一下。

3 个答案:

答案 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);
}