问题描述
我有一个疑问。当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 );
与上述交易相同-p3
和p4
均指向由char
组成的单个 20个元素的数组。在p4
的情况下,它指向char
的20个元素的数组序列中的第一个,但是再次从p4
本身的值中不能知道这一点。 / p>
请注意,malloc
和calloc
并不是以对象为单位,而是以字节为单位-您告诉他们要保留多少字节的内存,但是他们不知道什么类型的对象或对象序列将占用该内存。他们还需要某种方式来跟踪分配的内容,因此许多实现将在每次分配时为记账目的保留一些额外的内存。
malloc函数返回指向数组的指针对吗?
size_t n = ...;
void *p = malloc(n);
当返回的指针是 null指针时,分配失败,并且不应取消引用该指针。它不需要被释放。
if (p == NULL) Handle_Failure();
成功的void *malloc(size_t n)
调用会返回一个 pointer ,一个void *
,可以分配给任何对象指针类型。强制转换为not needed。 p
不是指向 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
,代码不就没有一种可移植的方法来获取分配的内存大小。代码应根据需要跟踪原始的n
。 malloc()
使用size_t
参数。
注意:free(NULL)
可以
我想知道那个记忆的结构。
没有结构。只是内存块
(类似于数组吗?)
内存块与数组完全相同。
区别仅在于该块的引用是指针。
- 您不能使用`sizeof运算符来获取该内存块的大小。
- 指针的引用与对内存块的引用不同。 (数组的地址总是引用数组的第一个元素)
当
malloc();
函数返回一个指针时,它是否是指向线性内存块的指针
是的,它是一个void
指针。
(类似于数组)。
不。它不是数组,换句话说,它不是传递给malloc()
的大小数组的第一个元素的指针。这是一个内存区域/块,实际上是连续的,但是返回的指针(或存储返回值的变量)将不具有数组的属性。
想知道那个记忆的结构
如果只想使用返回的内存位置,则无需打扰。您可以只将返回的指针存储到完整类型的指针变量中,然后使用该变量执行该内存位置的操作(从/向该位置读取/写入)。
,不返回指向数组的指针。
malloc(size_t n)
返回一个指向参数n
指定的连续内存位置的指针。
请注意,它与calloc(size_t nmem,size_t size)
相对,后者将每个位初始化为零,而malloc()
则使该值不确定,如注释中所建议。