Pointer指针导致C中的Segmentation Fault

Pointer Pointer leads to Segmentation Fault in C

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

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

arr[0] = &a;

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

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

int** arr2;

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

要初始化,请使用 int** arr2 = malloc(<someSize> * sizeof(*arr2)) 之类的东西。 (PS: malloc 可能 return NULL, 你必须使用 free 才能 return 内存).

从第一部分开始

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

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

来自第二部分

    int** arr2;
    arr2[0] = &a;

arr2是什么?是int**,一个指向int.

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

arr2 而不是 什么? 不是数组,所以你不能像你那样写arr[0]

你可以写什么

arr2int** 所以在第一种情况下它可以获得指向 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$ 

此代码

#include <stdio.h>

int main()
{
    int     a = 1;
    int*    arr[1]; // so arr is what? int*[]

    arr[0] = &a;

    int**   arr2; // arr2 is what? int**
    //arr2[0] = &a;

    arr2 = &arr[0];

    printf("*arr[0] = %d and **arr2 = %d\n",
        *arr[0], **arr2 );
    return 0;
};