如何解决指针指针导致 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;
所以 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$
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。