C 已分配结构中未分配的数据类型
假设我有这样一个结构定义:C 已分配结构中未分配的数据类型,c,pointers,struct,C,Pointers,Struct,假设我有这样一个结构定义: typedef struct Sample { int s; }Sample; 我声明一个指针变量,如下所示 Sample *sample = (Sample *)malloc(sizeof(Sample)); 现在我的问题是,“int”放在堆栈还是堆中?我的意思是“int s”也有动态内存分配吗?当您通过malloc为结构分配空间时,整个结构(即结构中包含的所有字段)都位于堆上。当您动态分配内存时,它总是从堆中获取。我猜答案就到此为止了它在堆上分配了一块
typedef struct Sample
{
int s;
}Sample;
我声明一个指针变量,如下所示
Sample *sample = (Sample *)malloc(sizeof(Sample));
现在我的问题是,“int”放在堆栈还是堆中?我的意思是“int s”也有动态内存分配吗?当您通过
malloc
为结构分配空间时,整个结构(即结构中包含的所有字段)都位于堆上。当您动态分配内存时,它总是从堆中获取。我猜答案就到此为止了它在堆上分配了一块足够大的内存,可以容纳样本
。假设您实际将示例
放在那里,则int
包含在其中。只有1个分配。(在本例中,它的大小将与一个int
)的大小相同。内存在堆上以样本对象的大小分配。s是任何示例对象的数据成员,因此它位于堆上。(顺便说一下,既然这个问题用C++和C++来标记,只要FIY在C++中使用新的而不是Malc),那么我只能释放“int s”,而不是整个样本对象吗?如果是,如何传递?您只能传递到free()
您从malloc()
或calloc()
或realloc()
接收到的内容。代码没有从malloc()
接收到sample
,因此只有sample
可以传递到free())
在C中调用malloc()
,1)时,不要强制转换返回值,它的“类型”已经是一个void*
,可以分配给任何指针。强制转换只会使代码变得混乱,使其更难理解、调试和维护。2) 始终检查(!=NULL)返回值以确保操作成功。堆的正式名称是dynamic storage IIRC。感谢您的回复。由于整个内存都是从堆中取出的,我可以释放'int's吗?@Abdulkadir不,你可以释放部分结构。您只能将传递给free
的内容传递给malloc
。所以你不能免费(&sample->s)
,你只能免费(sample)
。