微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决指针指针导致 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$ 

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