指针指针导致 C 来自第一部分来自第二部分查看输出这段代码

问题描述

为什么我可以创建一个指针数组并取消引用它的(指针-)元素。

int a = 1;
int* arr[1];

arr[0] = &a;

但不能用指针做同样的事情:

int** arr2;
arr2[0] = &a;
--> Seg fault

解决方法

int** arr2;

你没有初始化这个指针。访问它是未定义的行为,可能/将导致崩溃。

要初始化使用类似 int** arr2 = malloc(<someSize> * sizeof(*arr2)) 的东西。 (PS:malloc 可能会返回 NULL,必须使用 free 才能返回内存)。

,

来自第一部分

int a = 1;
int* arr[1];
arr[0] = &a;

所以 aintarr 是什么?它是 int*[],一个指向 int 的指针数组。所以第一个也是唯一的元素 arr[0] 是一个指向 int 的指针,并且为它分配一个 int 的地址是正常的。编译器对此没问题,因为运算符 & --- Address of --- 将 int a 的地址分配给指向 int,{{ 1}}。

来自第二部分

arr[0]

int** arr2; arr2[0] = &a; 是什么?它是 int**,一个指向 arr2 的指针。

  • intarr2
  • 所以 int***arr2,一个指向 int* 的指针
  • int 是一个 **arr

intNOT 什么? 不是一个数组,所以你不能像arr2那样写。

你可以写什么

arr[0]arr2,因此在第一种情况下它可以获得指向 int** 的指针的地址。在第一部分中,您有一系列这些。所以你肯定可以写

int

因为 arr2 = &arr[0]; 会提取一个指针的地址,而&是一个指向arr[0]的指针。而 intarr2,一个指向 int** 的指针。

查看输出

int

这段代码

toninho@DSK-2009:~/projects/um$ gcc -o tst -Wall -std=c17 pp.c
toninho@DSK-2009:~/projects/um$ ./tst
*arr[0] = 1 and **arr2 = 1
toninho@DSK-2009:~/projects/um$