#include <stdio.h>
int main()
{
int (*ptr) [5];
printf ("%lu\n" , sizeof (ptr));
printf ("%lu\n" , sizeof (*ptr));
}
我使用的是64位系统。当我在 gcc 编译器中运行此代码时,它会生成输出
8 and 20
。我的问题是要为此分配多少字节?是 8 或 20,为什么?这取决于您是否需要为指针或它所指向的内存分配内存。
您需要知道您所看到的物体的尺寸:
point to an array
旁注:
#include <stdio.h>
int main() {
int(*ptr)[5];
printf("%zu\n", sizeof ptr); // size of a pointer
printf("%zu\n", sizeof(char*)); // size of a pointer
printf("%zu\n", sizeof *ptr); // size of an int[5]
printf("%zu\n", sizeof(int[5])); // size of an int[5]
}
不是正确的转换。使用
%lu
代替 %zu
。您不为指向数组或其他对象的指针分配内存。您为数组或其他对象分配内存。指针仅用于指向它。它与记忆没有任何内在联系。
要为数组或其他对象分配内存,您需要告诉
sizeof
该对象需要多少字节。例如,
malloc
为 C 中使用 12 字节或更少字节的any对象分配内存,只要它没有某些扩展对齐要求。 (C 中的所有基本对象,标准整数、指针和浮点类型以及由它们组成的数组、联合和结构,都具有
void *p = malloc(12);
满足的基本对齐要求。)malloc
运算符将帮助您确定需要多少字节。您可以为
sizeof
运算符指定一个类型,例如 sizeof
表示 5 个 int [5]
的数组,它将给出正确的字节数:int
请注意,
void *p = malloc(sizeof (int [5]));
的类型与正在分配的内存或将放入其中的内容无关。指针只是指针。
但是,您可以声明适当类型的指针并将其与p
一起使用。给定
sizeof
,那么这段代码:int *p;
表示为
p = malloc(sizeof *p);
指向的任何类型的对象分配足够的内存。请注意,您必须使用
p
来表示 sizeof *p
指向的大小,而不是 p
,因为 sizeof p
是指针 sizeof p
的大小,而不是 p
指向的类型的大小.如果 p
指向对象数组中的第一个,则可以相乘以获得数组的大小:
p
您还可以使用指向整个数组的指针,而不是元素,如下所示:
p = malloc(5 * sizeof *p);
没有显式乘以元素数量,因为
int (*p)[5] = malloc(sizeof *p);
表示整个数组,而不是其中的单个元素。但是,这种形式并不经常使用,因为使用
*p
来访问数组元素会比较困难。由于 p
是整个数组,因此您需要使用 *p
来访问元素 (*p)[i]
,而不是第一个元素。当 i
是指向第一个元素的指针时,您可以使用 p
访问元素。因此,将这样的指针声明为 p[i]
比
int *p
更受青睐,除非有其他情况需要引用整个数组。int (*p)[5]
;声明一个指向 5 个整数数组的指针。让我们分解一下尺寸计算:
int (*ptr)[5]
:这给出了指针本身的大小。在 64 位上 系统中,一个指针一般占用8个字节。所以,
sizeof(ptr)
将会
8 岁。
sizeof(ptr)
:这给出了 ptr 指向的对象的大小, 这是一个由 5 个整数组成的数组 (
sizeof(*ptr)
)。数组的大小是
一个元素的大小乘以元素的数量。在
在这种情况下,在大多数系统上 int[5]
通常为 4 个字节,并且您
有 5 个元素。因此,sizeof(int)
将为 4 * 5 = 20。
sizeof(*ptr)
为 8,
sizeof(ptr)
为 20)是正确的。这意味着指针本身占用8个字节,它指向的数组(这是一个5个整数的数组)占用20个字节。