#include <stdio.h>
int main()
{
 int (*ptr) [5];
 printf ("%lu\n" , sizeof (ptr));
 printf ("%lu\n" , sizeof (*ptr));
}

我使用的是64位系统.当我在GCC编译器中运行这段代码时,它会生成输出8 and 20.我的问题是,要为这pointer to an array分配多少字节?现在是8点还是20点,为什么?

推荐答案

ptr指定将存储int的5元素数组中的address的对象.在您的系统上,这样的指针占用8字节的存储空间.

expression *ptr可以指定一个由5个元素组成的int数组的对象;在您的系统上,这样的数组占用20个字节(5个4字节元素).

假设代码:

int (*ptr)[5] = malloc( sizeof *ptr );

这将为您提供类似以下内容的内容(每个框占用4个字节):

     +---+        +---+
ptr: |   | -----> |   | (*ptr)[0]  // we don't want to index into ptr,
     + - +        +---+            // we want to index into what ptr
     |   |        |   | (*ptr)[1]  // *points to*, hence the explicit
     +---+        +---+            // dereference on ptr.  
                  |   | (*ptr)[2]  //
                  +---+            // Since a[i] is defined as *(a + i),
                  |   | (*ptr)[3]  // (*ptr)[i] == (*(ptr + 0))[i] ==
                  +---+            // (ptr[0])[i] == ptr[0][i]
                  |   | (*ptr)[4]  //
                  +---+

sizeof  ptr == sizeof (int (*)[5]) ==  8 // assuming 8-byte addresses
sizeof *ptr == sizeof (int [5])    == 20 // assuming 4-byte int

这相当于写

int arr[5];            // sizeof arr == sizeof (int [5])    == 20
int (*ptr)[5] = &arr;  // sizeof ptr == sizeof (int (*)[5]) ==  8

指针的大小并不取决于它所指向的对象的大小.

C++相关问答推荐

rSP堆栈指针在返回函数调用的值时有任何用途吗?

try 使用sigqueue函数将指向 struct 体的指针数据传递到信号处理程序,使用siginfo_t struct 体从一个进程传递到另一个进程

在C中使用动态内存分配找到最小的负数

从纯C中访问通用项对话框

使用scanf在C中读取和存储文件中的值

从uint8_t*转换为char*可接受

是否可以通过调用两个函数来初始化2D数组?示例:ARRAY[STARTING_ROWS()][STARTING_COLUMNS()]

为什么我的Hello World EFI程序构建不正确?

用gcc-msse 2编译的C程序包含AVX 1指令

如何在POSIX-UEFI中获得输入?

将非连续物理内存映射到用户空间

C中的char**v*char[]

在printf()中用%.*S格式填充长度为0的字符串是否会调用任何UB?如果是,是哪一个?

存储和访问指向 struct 的指针数组

Linux Posix消息队列

为什么一个在线编译器拒绝这个VLA代码,而本地的Apple clang却不拒绝;t?

I';我试着从.txt文件中读取文本,并用c计算其中的单词数量

在同一范围内对具有相同类型的变量执行的相同操作在同一C代码中花费的时间不同

我的代码可以与一个编译器一起使用,但不能与其他编译器一起使用

C 语言中 CORDIC 对数的问题