【问题标题】:C - How to find the size of a structure?C - 如何找到结构的大小?
【发布时间】:2011-12-12 17:35:15
【问题描述】:

在 c 中,假设你有以下结构和一个实例:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    typedef struct _a {
        int *a1;
        float *a2;
        char *a3;
    }a;

    a b;
    b.a1 = (int *) malloc(sizeof(int) * 10);
    b.a2 = (float *) malloc(sizeof(float) * 10);
    b.a3 = (char *) malloc(sizeof(char) * 10);

    return 0;
}

现在,如何找到与变量 b 分配/关联的总内存? sizeof(b) 将只返回结构中指针的组合大小,但不会计算使用 malloc 为不同类型/大小分配的内存的总和。如何在内存中找到这个结构的总大小(包括填充,如果适用)?

【问题讨论】:

    标签: c memory pointers structure sizeof


    【解决方案1】:

    您必须自己跟踪结构的总大小。

    C 基础架构不知道将哪些内存分配给哪些指针。 甚至通过指针创建一个强大的、通用的内存“所有权”概念也是极其困难的。

    为了说明,请意识到结构的元素可能包含引用其他内存的其他指针。其中一些引用可能在循环中(循环链表、无向图)。

    在这种情况下,计算内存可能变得非常困难。如果两个不同的元素指向同一个内存,应该计算两次还是一次?什么系统会跟踪哪些内存被计算在内?该系统如何适应 C 的极简范式?

    要完成您的要求,我认为您需要一种具有反射/内省功能的语言,例如 Java 或 .Net (C#)。

    【讨论】:

      【解决方案2】:

      没有标准的方法。

      如果您想知道每个指向的数组中存储了多少内存,则需要在结构中显式记录该信息,例如:

      typedef struct _a {
          int *a1;
          float *a2;
          char *a3;
          size_t num_elements_a1;
          size_t num_elements_a2;
          size_t num_elements_a3;
      }a;
      

      【讨论】:

        【解决方案3】:

        sizeof() 将考虑必要的填充。但是,它不是“深”sizeof,这意味着它不会跟随指针/引用,也不会包含指向对象的大小,包括 a1...a3 数组你的榜样。

        如果这是您要查找的内容,则必须自己计算。最简单的方法是跟踪为每个数组分配的元素数量,并在大小计算中使用它。

        【讨论】:

          【解决方案4】:

          sizeof() 将返回结构的大小,包括填充,但是要计算包括分配内存在内的总大小,您必须编写自己的函数。为此,您还需要记录已分配的每种数据类型的数量,因为在分配完成后无法知道这一点。

          【讨论】:

            【解决方案5】:

            执行此操作的一种非常非常非标准的方法是确定系统 malloc 的工作方式。这确实适用于大多数 linux'es

            你把 malloc 给你的指针移回 sizeof(ptr) - 这里存储的值通常是 malloc 调用中保留的内存块的大小。

            这样做会使所有保修失效,我只会将其用于调试。不过,最好在 malloc 内存时存储该值。

            【讨论】:

            • @OliCharlesworth - 我做到了:-) - 重写了答案
            猜你喜欢
            • 2011-11-15
            • 2010-09-13
            • 2014-08-23
            • 1970-01-01
            • 2015-02-17
            • 2013-12-12
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多