free 是否会从较小的结构指针中释放较大结构指针的所有内存?

Does free deallocate all the memory of a larger struct pointer from a smaller one?

所以,我正在尝试用 C 实现多态系统,类似于 PyObject 和 Python 对象系统。但是,我无法理解如何释放从基本结构转换而来的结构。我已经实现了以下基本和高级结构类型:

#include "stdio.h"
#include "stdlib.h"

//testing for garbage collection

//base handler to ensure polymorphism
#define BASE char g;

struct temp {
  BASE
  short w;
};

struct femp {
  BASE
  short w;
  long d;
};


int main(void) {
  struct femp* first = malloc(sizeof(struct femp));
  first->d = 3444;
  struct temp* second = (struct temp*)first;
  free(second); // does this deallocate all the memory of first?
  free(first);
  return 0;
}

注意:如果第二个被释放,上述程序将以非零状态退出,但不是第一个。

结果:

7fb829d02000-7fb829d04000 rw-p 00000000 00:00 0 
7fb829d0c000-7fb829d10000 rw-p 00000000 00:00 0 
7fb829d10000-7fb829d11000 r--p 00023000 00:136 38                        /usr/lib/x86_64-linux-gnu/ld-2.24.so
7fb829d11000-7fb829d12000 rw-p 00024000 00:136 38                        /usr/lib/x86_64-linux-gnu/ld-2.24.so
7fb829d12000-7fb829d13000 rw-p 00000000 00:00 0 
7fffac407000-7fffac428000 rw-p 00000000 00:00 0                          [stack]
7fffac499000-7fffac49b000 r--p 00000000 00:00 0                          [vvar]
7fffac49b000-7fffac49d000 r-xp 00000000 00:00 0                          [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0                  [vsyscall]
exited with non-zero status

我的问题是,在指向较小结构的指针上调用 free() 是否仍然释放所有内存?就像在我的代码中一样,首先释放或第二次释放有什么区别吗?在释放之前是否应该总是转换回原始类型?

malloc() / free() 对你的结构一无所知。 malloc() 接受一个整数参数并分配那么多字节,给你一个内存地址。 free() 获取该地址,并释放分配的任何内容。在此期间你用它做什么取决于你。

如果您需要一些内存来容纳两件事中的一件,您需要确保它足够大。如果你分配一个 5 加仑的桶,只用它来装 3 加仑的水,那很好。如果你试图携带 7 加仑,你会弄湿你的脚。 C不会干扰你做任何事情。