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

C free是否从较小的结构指针释放较大结构指针的所有内存?,c,struct,free,C,Struct,Free,因此,我试图用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; }

因此,我试图用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也不会干扰您的操作。

malloc()
/
free()
对您的结构一无所知
malloc()
接受一个整数参数并分配这么多字节,从而为您提供一个内存地址
free()
获取该地址,并释放分配的任何内容。在此期间,你如何处理它取决于你自己


如果你需要一些可能包含两件事情中的一件的内存,那就由你来确定它是否足够大。如果你分配一个5加仑的桶,只用来装3加仑,那就好了。如果你想搬7加仑,你会被淋湿的。C也不会干扰您的操作。

您不“分配结构”,而是分配内存量。Malloc接受一个整数参数,它是一个字节数。Free只释放所释放的字节数。两人都不知道结构。
free
将指针指向
void
。所以它真的不在乎它之前被铸造成什么。好吧,这意味着你必须释放()任何大小的结构最初是malloc的?正确吗?@JoshWeinstein,
free
不关心结构、字符或任何东西。它只是释放一个指针指向的内存,仅此而已。是的,但是如果我释放一个指针指向一个从一个更大的结构(在本例中为第二个结构)铸造的结构,我问题中的上述程序将以非零状态退出,这促使我问这个问题。你不是“分配结构”,而是分配大量内存。Malloc接受一个整数参数,它是一个字节数。Free只释放所释放的字节数。两人都不知道结构。
free
将指针指向
void
。所以它真的不在乎它之前被铸造成什么。好吧,这意味着你必须释放()任何大小的结构最初是malloc的?正确吗?@JoshWeinstein,
free
不关心结构、字符或任何东西。它只是释放一个指针指向的内存,仅此而已。是的,但是如果我释放一个指针指向一个从一个更大的结构(本例中是第二个)铸造的结构,我问题中的上述程序将以非零状态退出,这促使我问这个问题。好的,这是有意义的,但是为什么在这种情况下释放指向较小结构的指针会导致非零状态?因为释放同一地址两次。好的,这是有道理的,但是为什么在这种情况下释放指向较小结构的指针会导致非零状态?因为释放同一地址两次。