如何在转换为int后取消引用指针**改变它指向的值?

hac*_*k3r 2 c pointers

#include<stdio.h>

int main()
{
  int *previous, *current ;
  int a[5] = {1,2,3,4,5};
  current =(int *) a ;
  previous = current ;
  current = *( (int**) current ) ; //my question is on this line

  printf ("\nprevious is 0x%x and current is 0x%x \n ", previous , current ) ;
  printf ("\nprev+1 0x%x ,  prev+4 0x%x \n", previous+1 , previous+4 ) ;
return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出是:

bash-3.00$ ./a.out

previous is 0xffffd0f8 and current is 0x1

prev+1 0xffffd0fc ,  prev+4 0xffffd108
Run Code Online (Sandbox Code Playgroud)

我的问题是:"current"之前指向数组的开始,然后再引用它并再次取消引用.以下语句如何更改"当前"的值?

current = *( (int**) current ) ;
Run Code Online (Sandbox Code Playgroud)

此外,如果我打印*之前它将打印1而*current将核心转储.这种行为的原因是什么?

Dan*_*her 5

current = *( (int**) current ) ;
Run Code Online (Sandbox Code Playgroud)

首先,你转换current为a int**,所以存储在从sizeof(int**)开始的字节的值&current将被解释为a的地址int*.然后取消引用从演员表中获得的指针.这意味着,int**假定存储在那里,并sizeof(int*)存储该地址的字节current.

现在,current指向数组的第一个元素a,因此存储在开头的字节a被复制到current.如果sizeof(int*) == sizeof(int),则int存储的值1 a[0]被解释为地址.如果sizeof(int*) == 2*sizeof(int)(另一种常见的情况),则指针值由两个ints 1和2组成.

previous指向第一个元素a,因此取消引用会previous产生值1. 解除引用current现在尝试int从地址1 读取(它是未定义的行为,所以其他任何事情都不会违反标准,但这是正常的过程),通常无法访问该过程.