Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/magento/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 当为结构分配内存时,指向该结构的指针的大小是否会增加?_C_Structure_Dynamic Memory Allocation - Fatal编程技术网

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

C 当为结构分配内存时,指向该结构的指针的大小是否会增加?,c,structure,dynamic-memory-allocation,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 ));

假设我有以下结构:

  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语句的输出是什么

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

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

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

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

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

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

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

sizeof(Array)
将返回一个
数组的大小,该数组由一个
int
和一个指针组成,如果您有一个8字节的指针,并且编译器决定插入一些填充,则最有可能是8或12,或者16


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

指针的大小不会改变,但我认为您询问的是指针指向的内容的大小。
sizeof(一些指针变量或类型)
返回指针的大小,而不是指针指向的内容。指针包含结构的第一个字节的地址。为什么指针的大小会增加?啊,我看到了我对第一个的错误。感谢您对另外两个的清晰解释和示例。“所有地址*大小相同”->不完全相同。正如您所指出的,指向函数的指针的大小与对象指针的大小不同是很常见的。即使在同一平台上,C也支持各种不同大小的指针
int*
char*
,等等。