这是我的代码。
#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分配的总大小?
答案 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字节,因为数据类型为长无符号整数。