malloc函数返回指向数组的指针对吗?

问题描述

我有一个疑问。当malloc()函数返回一个指针时,它是指向线性内存块(类似于数组)的指针吗?还是其他?

我想知道该内存的结构

解决方法

指针仅指向指向类型(尽管该对象可能是聚合类型)或函数的单个对象。该对象可能是较大序列(如数组)中的第一个对象,但是您不能从指针本身知道这一点。给定的代码如

char x;
char *p1 = &x;
char *p2 = malloc( sizeof *p2 * 10 );

无法从指针本身知道p1指向单个独立对象,而p2指向对象序列中的第一个对象。您必须分别跟踪该信息。

对于指向聚合类型的指针而言,这是正确的

char a[20];
char (*p3)[20] = &a;
char (*p4)[20] = malloc( sizeof *p4 * 10 );

与上述交易相同-p3p4均指向由char组成的单个 20个元素的数组。在p4的情况下,它指向char的20个元素的数组序列中的第一个,但是再次从p4本身的值中不能知道这一点。 / p>

请注意,malloccalloc并不是以对象为单位,而是以字节为单位-您告诉他们要保留多少字节的内存,但是他们不知道什么类型的对象或对象序列将占用该内存。他们还需要某种方式来跟踪分配的内容,因此许多实现将在每次分配时为记账目的保留一些额外的内存。

,

malloc函数返回指向数组的指针对吗?

size_t n = ...;
void *p = malloc(n);

当返回的指针是 null指针时,分配失败,并且不应取消引用该指针。它不需要被释放。

if (p == NULL) Handle_Failure();

成功的void *malloc(size_t n)调用会返回一个 pointer ,一个void *,可以分配给任何对象指针类型。强制转换为not neededp不是指向 array 的指针,而只是指向void *的指针。分配的内存可以是任何对象(包括数组)的副本的目的地。

my_type *p = malloc(n);

使用指针存储数组int或任何对象的内容。只要初始分配足够大,就没有关系。指针符合所有对象类型的对齐要求。完成后,完全一次释放它。然后不要使用指针中的值。但是p可以重新分配。

int foo(const struct abc *x) {
  struct abc *p = malloc(sizeof *p);
  if (p == NULL) {
    return 1;
  }
  *p = *x;
  bar(p);
  free(p);
  return 0;
}
  

分配0字节是一种特殊情况,可以完成。 malloc()是否应该返回 null指针,该指针不应被取消引用。否*p


一旦代码获得p,代码就没有一种可移植的方法来获取分配的内存大小。代码应根据需要跟踪原始的nmalloc()使用size_t参数。


注意:free(NULL)可以

,

我想知道那个记忆的结构。

没有结构。只是内存块

(类似于数组吗?)

内存块与数组完全相同。

区别仅在于该块的引用是指针。

  1. 您不能使用`sizeof运算符来获取该内存块的大小。
  2. 指针的引用与对内存块的引用不同。 (数组的地址总是引用数组的第一个元素)
,

malloc();函数返回一个指针时,它是否是指向线性内存块的指针

是的,它是一个void指针。

(类似于数组)。

不。它不是数组,换句话说,它不是传递给malloc()的大小数组的第一个元素的指针。这是一个内存区域/块,实际上是连续的,但是返回的指针(或存储返回值的变量)将不具有数组的属性。

想知道那个记忆的结构

如果只想使用返回的内存位置,则无需打扰。您可以只将返回的指针存储到完整类型的指针变量中,然后使用该变量执行该内存位置的操作(从/向该位置读取/写入)。

,

返回指向数组的指针。

malloc(size_t n)返回一个指向参数n指定的连续内存位置的指针。

请注意,它与calloc(size_t nmem,size_t size)相对,后者将每个位初始化为零,而malloc()则使该值不确定,如注释中所建议。

Default value of malloc

Why malloc may be indeterminate from SO

More about calloc and malloc from SO