使用malloc并使用sizeof打印后,为什么我没有获得正确的大小?

时间:2015-04-22 22:14:25

标签: c

这是我的代码。

#include<stdio.h>

typedef struct {
    int a,b;
    } integers;

void main() {
    integers *ptr = (integers *)malloc(10*sizeof(integers));
    printf("%d",sizeof(*ptr)); // prints 8

}

根据我对Malloc的理解,上面的代码实际上应该保留10x8 = 80字节的内存供ptr指向。

为什么使用sizeof(* ptr)只给8?如何找到为ptr分配的总大小?

2 个答案:

答案 0 :(得分:1)

  

为什么使用sizeof(* ptr)只给8?如何找到为ptr分配的总大小?

表达式*ptr的类型是integers - 因此,

sizeof *ptr == sizeof (integers) == sizeof (int) + sizeof (int)

您无法通过查看指针来确定分配的缓冲区的大小(它不存储有关缓冲区大小的任何元数据)。您必须单独跟踪这些信息。

修改

请注意,您可以执行以下操作:

 integers (*foo)[10] = malloc( sizeof *foo );
 if ( foo )
   printf( "sizeof *foo = %zu\n", sizeof *foo );

这将为您提供您期望的结果。在这种情况下,foo是指向integers数组的指针,而不是指向integers的单个实例,因此sizeof *foo会给你已分配数组的大小。缺点是你必须在应用下标之前解除引用foo

(*foo)[i].a = some_value();         // or foo[0][i].a
(*foo)[i].b = some_other_value();   // or foo[0][i].b

当您想要分配NxM数组并确保所有行都是连续的时,通常会这样做:

integers (*foo)[10] = malloc( 10 * sizeof *foo );

将分配一个10x10的integers数组,以使这些行在内存中都相邻。

此外,指向10个元素的integers数组的指针与指向integers的11个元素数组的指针不兼容,这使得编写可以使用指针的函数变得更加困难到不同大小的数组。 IOW,如果你有一个声明为

的函数
void bar( integers (*foo)[10] ) { ... }

它只能 使用integers的Nx10数组。有很多方法可以解决不同程度的痛苦,但这是另一天的话题。

答案 1 :(得分:0)

嗯,我知道这个问题已经过时了,但是由于找不到合适的答案,我决定写一个。 当指定sizeof(*ptr)时,实际上是在尝试获取存储在指针所指向的变量中的数据类型的大小(这里是数组的第一个元素)。在这里,显然是8。

即使您尝试打印sizeof(ptr),您也将再次打印指针地址的大小,该地址在GCC编译器中默认为8字节,因为数据类型为长无符号整数。