为什么我可以创建一个指针数组并取消引用它的(指针-)元素。
int a = 1;
int* arr[1];
arr[0] = &a;
但不能用指针做同样的事情:
int** arr2;
arr2[0] = &a;
--> Seg fault
答案 0 :(得分:1)
int** arr2;
你没有初始化这个指针。访问它是未定义的行为,可能/将导致崩溃。
要初始化使用类似 int** arr2 = malloc(<someSize> * sizeof(*arr2))
的东西。 (PS:malloc
可能会返回 NULL
,必须使用 free
才能返回内存)。
答案 1 :(得分:1)
int a = 1;
int* arr[1];
arr[0] = &a;
所以 a
是 int
。 arr
是什么?它是 int*[]
,一个指向 int
的指针数组。所以第一个也是唯一的元素 arr[0]
是一个指向 int
的指针,并且为它分配一个 int
的地址是正常的。编译器对此没问题,因为运算符 &
--- Address of --- 将 int
a
的地址分配给指向 int
, {{ 1}}。
arr[0]
int** arr2;
arr2[0] = &a;
是什么?它是 int**,一个指向 arr2
的指针。
int
是 arr2
int**
是 *arr2
,一个指向 int*
的指针int
是一个 **arr
int
是 NOT 什么? 不是一个数组,所以你不能像arr2
那样写。
arr[0]
是 arr2
,因此在第一种情况下它可以获得指向 int**
的指针的地址。在第一部分中,您有一系列这些。所以你肯定可以写
int
因为 arr2 = &arr[0];
会提取一个指针的地址,而&
是一个指向arr[0]
的指针。而 int
是 arr2
,一个指向 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$