2017-03-07 81 views
-2

比方说,我有以下结构:指向结构的指针的大小是否随着为该结构分配内存而增加?

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以及?

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

+1

指针的大小不会改变,但我想你询问指针指向的内容的大小。 – Rob

+3

'sizeof(some_pointer_variable_or_type)'返回指针*的大小,而不是它指向的内容。 –

+2

指针包含结构的第一个字节的地址。为什么指针大小会增加? – StoryTeller

回答

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的告诉你,你需要多少个字符,以保持其参数的类型的实例。

+0

啊,我看到我的第一个错误。感谢您为其他两位作出明确的解释和举例。 –

0

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

无论初始化还是未初始化,变量都具有相同的大小。

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

*(我相信函数地址都来自非函数的地址不同的大小,但你不使用这里的任何函数指针)

+0

“所有地址*都是相同的大小” - >不是真的。正如您所指出的,指向函数的指针的大小通常与对象指针的大小不同。 C即使在同一个平台上也支持各种不同大小的指针'int *','char *'等等。 – chux