【问题标题】:Does the size of a pointer to a structure increase as memory is allocated for that structure?指向结构的指针的大小是否会随着为该结构分配内存而增加?
【发布时间】:2017-07-28 07:07:35
【问题描述】:

假设我有以下结构:

  typedef struct
  {
  int length ;
  int * data ;
  } Array ;

在我的主要功能中,我执行以下操作:

 int length = 10;
 char * filename = " data ";
 // create an object
 Array * arrptr1 = NULL ;
 printf (" sizeof ( arrptr1 ) = % d \ n ", ( int ) sizeof ( arrptr1 ));
 arrptr1 = malloc ( sizeof ( Array ));
 printf (" sizeof ( arrptr1 ) = %d , sizeof ( Array ) = % d \ n" ,
 ( int ) sizeof ( arrptr1 ) , ( int ) sizeof ( Array ));
 // allocate memory for the data
 arrptr1 -> length = length ;
 arrptr1 -> data = malloc ( sizeof ( int ) * ( arrptr1 -> length ));
 printf (" sizeof ( arrptr1 ) = %d , sizeof ( arrptr1 -> data ) = % d \ n " ,
 ( int ) sizeof ( arrptr1 ) , ( int ) sizeof ( arrptr1 -> data ));

每个打印语句会打印什么?

我知道对于第一次打印,sizeof(arrptr1) 将只是一个垃圾值。

对于第二次打印,sizeof(arrptr1) = 8 和 sizeof(Array) = 8 也一样吗?

第三个打印语句会输出什么?

【问题讨论】:

  • 指针的大小不会改变,但我想你是在问指针指向的内容的大小。
  • sizeof(some_pointer_variable_or_type) 返回 指针 的大小,而不是它所指向的大小。
  • 指针包含结构第一个字节的地址。为什么指针大小会增加?

标签: c structure dynamic-memory-allocation


【解决方案1】:

我知道对于第一次打印,sizeof(arrptr1) 将只是一个垃圾值。

不,它将是指针的大小。例如,如果它是一个 64 位平台,其中所有指针都是 8 个字节,它将打印 8。如果它没有给你一个合理的值,你怎么知道要分配多少内存来存储该类型的实例?

对于第二次打印,sizeof(arrptr1) = 8 和 sizeof(Array) = 8 也一样吗?

不太可能。由于Array 有一个整数和一个指针,因此在具有 8 个字节指针和 4 个字节整数的平台上,它可能会增加 16 个字节。 (如果是 12 个字节,Arrays 的数组将所有其他元素都未对齐。)

第三个打印语句会输出什么?

认为sizeof 关心您询问其大小的东西是什么,这是一个常见的初学者错误。它只是给出了相关类型的大小。

char * j;
sizeof(j);    // equivalent to sizeof(char*)
sizeof(*j);   // equivalent to sizeof(char)

j = "hello";
sizeof(j);    // still equivalent to sizeof(char*)
sizeof(*j);   // still equivalent to sizeof(char)

j = malloc(32);
sizeof(j);    // still equivalent to sizeof(char*)
sizeof(*j);   // still equivalent to sizeof(char)

您可以将sizeof 视为告诉您需要多少个字符来保存其参数类型的实例。

【讨论】:

  • 啊,我看到我的第一个错误。感谢您对其他两个的清晰解释和示例。
【解决方案2】:

sizeof(arrptr1)sizeof(arrptr1->data) 都是指针的大小。指针是一个保存地址的变量。所有地址* 大小相同。所以这些总是会打印相同的值。

无论是否初始化,变量的大小都是相同的。

sizeof(Array) 将返回一个Array 的大小,由一个int 和一个指针组成 - 如果你有一个 8 字节的指针,它很可能是 8 或 12,或者 16和 em> 编译器决定插入一些填充。

*(我相信函数地址可以与非函数地址的大小不同,但你在这里没有使用任何函数指针)

【讨论】:

  • “所有地址* 大小相同”-> 并非如此。正如您所指出的,指向函数的指针的大小与对象指针的大小不同是很常见的。 C支持各种不同大小的指针int*char*等,即使在同一个平台上。
猜你喜欢
  • 2016-05-06
  • 2021-12-26
  • 1970-01-01
  • 1970-01-01
  • 2015-07-04
  • 2013-02-23
  • 2019-09-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多