#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;
}
输出是:
bash-3.00$ ./a.out
previous is 0xffffd0f8 and current is 0x1
prev+1 0xffffd0fc , prev+4 0xffffd108
我的问题是:"current"之前指向数组的开头,在它被引用并再次取消引用之前。下面的语句如何改变“current”的值?
current = *( (int**) current ) ;
此外,如果我打印 *previous 它将打印 1 而 *current 将进行核心转储。这种行为的原因是什么?
最佳答案
current = *( (int**) current ) ;
首先,您将 current
转换为 int**
,因此存储在 sizeof(int**)
字节中的值从¤t
将被解释为 int*
的地址。然后取消引用从强制转换中获得的指针。这意味着,假设存储在那里的 int**
之后,该地址处的 sizeof(int*)
字节存储在 current
.
此时,current
指向数组a
的第一个元素,所以a
开头的字节被复制到当前
。如果 sizeof(int*) == sizeof(int)
,则存储在 a[0]
中的 int
值 1 然后被解释为地址.如果 sizeof(int*) == 2*sizeof(int)
(另一种常见情况),则指针值由两个 int
1 和 2 组成。
previous
指向 a
的第一个元素,因此取消引用 previous
会产生值 1。取消引用 current
现在尝试从地址 1 读取一个 int
(这是未定义的行为,所以无论发生什么都不会违反标准,但这是正常的过程),通常无法访问过程。
关于c - 在转换为 int ** 后取消引用指针如何更改它指向的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13583092/