【发布时间】:2016-01-27 16:56:28
【问题描述】:
假设我有一个这样的结构定义:
typedef struct Sample
{
int s;
}Sample;
我声明了一个指针变量,如下所示
Sample *sample = (Sample *)malloc(sizeof(Sample));
现在我的问题是,这个 'int s' 放在哪里,在堆栈还是堆中?我的意思是“int s”也有动态内存分配吗?
【问题讨论】:
-
它在堆上分配了一块足够大的内存用于
Sample。假设您实际上在那里放置了一个Sample,则int包含在其中。只有1个分配。 (在这种情况下,它将与int的大小相同)。 -
内存分配在堆上,大小为 Sample 对象。 s 是任何示例对象的数据成员,所以是的,它在堆上。 (顺便说一句,由于这个问题同时被 C++ 和 C 标记,仅供参考,您应该在 C++ 中使用 new 而不是 malloc)
-
那么我可以只释放'int s',而不是整个示例对象吗?如果有,怎么做?
-
您只能将您从
malloc()或calloc()或realloc()收到的内容传递给free()代码没有从malloc()收到s它确实收到了一个指针放入sample,所以只有sample可以传递给free() -
在C中调用
malloc(), 1)时,不要强制转换返回值,它的类型已经是void*,可以赋值给任何指针。强制转换只会使代码混乱,使其更难以理解、调试和维护。 2) 始终检查 (!=NULL) 返回值以确保操作成功。