【发布时间】:2020-12-11 14:18:35
【问题描述】:
有人可以向我解释为什么当我使用calloc 或malloc 动态分配内存时我声明:
int *arr
int n
arr = malloc(n * sizeof(int))
而不是
*arr = malloc(n * sizeof(int))
【问题讨论】:
标签: c pointers malloc dynamic-memory-allocation
有人可以向我解释为什么当我使用calloc 或malloc 动态分配内存时我声明:
int *arr
int n
arr = malloc(n * sizeof(int))
而不是
*arr = malloc(n * sizeof(int))
【问题讨论】:
标签: c pointers malloc dynamic-memory-allocation
因为在第一个示例中,您将arr 设为指向内存的指针。在第二个示例中,您正在使 arr 指向指向已分配内存的指针。
换句话说,您将 arr 声明为指针。 Malloc 返回一个指向已分配内存的指针。所以你用那个值“填充” arr 。在您的第二个示例中,您将使用 malloc 返回的值填充 *arr(arr 指向的内容)。
【讨论】:
arr 是一个int *,即“指向int 的指针”。当您使用malloc 动态分配内存时,您会得到一个指向该内存的指针,并且应该将它分配给一个变量,在本例中为arr。
*arr(即arr 的取消引用)将只是一个int。 *arr 是arr 指向的值,而不是指针(地址)本身。
【讨论】:
在这段代码中sn-p:
int *arr
int n
arr = malloc(n * sizeof(int));
用分配的内存地址设置变量(指针)arr的值。
在此声明中:
*arr = malloc(n * sizeof(int));
类型为int 的指针arr 指向的对象由分配的内存地址设置。然而,指针arr 没有被初始化并且没有指向一个有效的对象。此外,表达式*arr 的类型为int,而右侧表达式的类型为void *。所以编译器会报错。
你需要设置指针本身的值,而不是指针对象所指向的值。
【讨论】: