【问题标题】:Unallocated data type in allocated struct已分配结构中的未分配数据类型
【发布时间】: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) 返回值以确保操作成功。

标签: c pointers struct


【解决方案1】:

当您通过mallocstruct 分配空间时,整个struct(即struct 中包含的所有字段)都在堆上。

【讨论】:

  • heap的正式名称是dynamic storage IIRC。
  • 感谢您的回复。由于整个内存都是从堆中取出的,我可以以某种方式释放“int s”吗?
  • @Abdulkadir 不,您可以释放部分结构。您只能将传递给malloc 的内容传递给free。所以你不能free(&sample->s),你只能free(sample)
【解决方案2】:

当您动态分配内存时,它总是从堆中获取。我想这结束了答案

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-11
    • 2021-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-07
    • 1970-01-01
    相关资源
    最近更新 更多