在动态内存分配中使用指针

Use of pointers in dynamic memory allocation

有人可以向我解释为什么当我使用 callocmalloc 动态分配内存时,我声明:

int *arr
int n
arr = malloc(n * sizeof(int))

而不是

*arr = malloc(n * sizeof(int))

因为在第一个示例中,您将 arr 设为指向内存的指针。在第二个示例中,您正在使 arr 指向指向已分配内存的指针。

换句话说,您将 arr 声明为指针。 Malloc returns 指向已分配内存的指针。所以你用那个值“填充” arr 。在你的第二个例子中,你用 malloc 返回的值填充 *arr——arr 指向的内容。

arr 是一个 int *,即“指向 int 的指针”。当您使用 malloc 动态分配内存时,您会得到一个指向该内存的指针,并且应该将其分配给一个变量,在本例中为 arr.

*arr(即 arr 的取消引用)只是一个 int*arrarr指向的值,不是指针(地址)本身。

在此代码段中:

int *arr
int n
arr = malloc(n * sizeof(int));

设置了变量(指针)的值arr与分配内存的地址。

在此声明中:

*arr = malloc(n * sizeof(int));

指针arr 指向的对象int 由分配的内存地址设置。但是,指针 arr 未初始化且未指向有效对象。此外,表达式 *arr 的类型为 int,而右侧表达式的类型为 void *。所以编译器会报错。

您需要设置指针本身的值,而不是指针对象指向的值。