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

标签 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;
}

输出是:

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/

相关文章:

C:查找数组中元素的数量[]

C 链表推送函数,只是检查这个是否正确

c - 在分配连续内存的 malloc 和 calloc 之间

c - 如何在 C 中使用具有相同名称的不同枚举

java - 如何通过 Java 中的套接字获取错误流?

从 Swift 调用 2D C 数组

C "comparison between pointer and integer"菜单警告

c - 加载图形文件

c - int *a[3] 和 int (*a)[3] 之间的区别?

c++ - 从 weak_ptr 列表中删除项目