当为该结构分配内存时,指向结构的指针的大小是否会增加?

时间:2017-03-07 21:54:36

标签: c structure dynamic-memory-allocation

假设我有以下结构:

  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?

第三个print语句会输出什么?

2 个答案:

答案 0 :(得分:4)

  

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

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

  

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

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

  

第三个print语句会输出什么?

认为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视为告诉您需要多少个字符来保存其参数类型的实例。

答案 1 :(得分:0)

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

变量具有相同的大小,无论它是否已初始化。

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

*(我认为允许函数地址与非函数地址的大小不同,但是你没有在这里使用任何函数指针)