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;
所以 a
是 int
。 arr
是什么?它是 int*[]
,一个指向 int
的指针数组。所以第一个也是唯一的元素 arr[0]
是一个指向 int
的指针,通常将 int
的地址分配给它。编译器对此没有问题,因为运算符 &
--- Address of --- 将 int
a
的地址分配给指向 int
、arr[0]
.
来自第二部分
int** arr2;
arr2[0] = &a;
arr2
是什么?是int**,一个指向int
.
的指针
arr2
是 int**
- 所以
*arr2
是int*
,一个指向int
的指针
- 和
**arr
是一个int
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$
此代码
#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;
};
为什么我可以创建一个指针数组并取消引用它的(指针)元素。
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;
所以 a
是 int
。 arr
是什么?它是 int*[]
,一个指向 int
的指针数组。所以第一个也是唯一的元素 arr[0]
是一个指向 int
的指针,通常将 int
的地址分配给它。编译器对此没有问题,因为运算符 &
--- Address of --- 将 int
a
的地址分配给指向 int
、arr[0]
.
来自第二部分
int** arr2;
arr2[0] = &a;
arr2
是什么?是int**,一个指向int
.
arr2
是int**
- 所以
*arr2
是int*
,一个指向int
的指针
- 和
**arr
是一个int
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$
此代码
#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;
};