当为该结构分配内存时,指向该结构的指针的大小是否会增加?
Does the size of a pointer to a structure increase as memory is allocated for that structure?
假设我有以下结构:
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 也会吗?
第三个打印语句会输出什么?
I know for the first print, sizeof(arrptr1) would just be a garbage value.
不,这将是指针的大小。例如,如果它是一个 64 位平台,其中所有指针都是 8 个字节,它将打印 8。如果它没有给你一个合理的值,你怎么知道要分配多少内存来存储该类型的实例?
For the second print, would sizeof(arrptr1) = 8 and sizeof(Array) = 8 as well?
不太可能。由于 Array
有一个整数和一个指针,因此在具有 8 字节指针和 4 字节整数的平台上,它可能会增加 16 字节。 (如果它是 12 个字节,Array
的数组将不对齐所有其他元素。)
What would the third print statement output?
初学者常犯的一个错误是认为 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)
将 return Array
的大小,由 int
和指针组成 - 最有可能是 8 或 12,或者 16,如果你有一个 8 字节的指针 并且 编译器决定插入一些填充。
*(我相信函数地址允许与非函数地址的大小不同,但你在这里没有使用任何函数指针)
假设我有以下结构:
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 也会吗?
第三个打印语句会输出什么?
I know for the first print, sizeof(arrptr1) would just be a garbage value.
不,这将是指针的大小。例如,如果它是一个 64 位平台,其中所有指针都是 8 个字节,它将打印 8。如果它没有给你一个合理的值,你怎么知道要分配多少内存来存储该类型的实例?
For the second print, would sizeof(arrptr1) = 8 and sizeof(Array) = 8 as well?
不太可能。由于 Array
有一个整数和一个指针,因此在具有 8 字节指针和 4 字节整数的平台上,它可能会增加 16 字节。 (如果它是 12 个字节,Array
的数组将不对齐所有其他元素。)
What would the third print statement output?
初学者常犯的一个错误是认为 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)
将 return Array
的大小,由 int
和指针组成 - 最有可能是 8 或 12,或者 16,如果你有一个 8 字节的指针 并且 编译器决定插入一些填充。
*(我相信函数地址允许与非函数地址的大小不同,但你在这里没有使用任何函数指针)