c 中指向数组的指针的内存分配?

问题描述 投票:0回答:3
#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,为什么?
    

arrays c pointers
3个回答
0
投票
我的问题是要为数组分配多少字节?是 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
    


0
投票
我的问题是要为数组分配多少字节?是 8 或 20,为什么?

您不为指向数组或其他对象的指针分配内存。您为数组或其他对象分配内存。指针仅用于指向它。它与记忆没有任何内在联系。

要为数组或其他对象分配内存,您需要告诉

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
更受青睐,除非有其他情况需要引用整个数组。
    


0
投票
int (*p)[5]

;声明一个指向 5 个整数数组的指针。让我们分解一下尺寸计算:


  1. int (*ptr)[5]

    :这给出了指针本身的大小。在 64 位上 系统中,一个指针一般占用8个字节。所以,

    sizeof(ptr)
    将会 8 岁。
    
    

  2. sizeof(ptr)

    :这给出了 ptr 指向的对象的大小, 这是一个由 5 个整数组成的数组 (

    sizeof(*ptr)
    )。数组的大小是 一个元素的大小乘以元素的数量。在 在这种情况下,在大多数系统上
    int[5]
    通常为 4 个字节,并且您 有 5 个元素。因此,
    sizeof(int)
    将为 4 * 5 = 20。
    
    

  3. 因此,您看到的输出(
sizeof(*ptr)

为 8,

sizeof(ptr)
为 20)是正确的。这意味着指针本身占用8个字节,它指向的数组(这是一个5个整数的数组)占用20个字节。
    

© www.soinside.com 2019 - 2024. All rights reserved.