C - 如何找到结构的大小?

时间:2011-12-12 17:35:16

标签: c memory pointers structure sizeof

在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为不同类型/大小分配的内存总和。如何在内存中找到此结构的总大小(包括填充,如果适用)?

5 个答案:

答案 0 :(得分:5)

没有标准的方法。

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

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;

答案 1 :(得分:4)

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

C基础结构不知道为哪些指针分配了哪些内存。 即使通过指针创建一个强大的,通用的“内存所有权”概念也是非常困难的。

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

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

要做你所要求的,我认为你需要一种带有反射/内省的语言,例如Java或.Net(C#)。

答案 2 :(得分:2)

sizeof()会考虑必要的填充。但是,它不是“深”sizeof,这意味着它不会跟随指针/引用,也不会包含指向对象的大小,包括a1 ... {您的示例中的{1}}数组。

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

答案 3 :(得分:1)

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

答案 4 :(得分:0)

非常非标准的方法是弄清楚你的系统malloc是如何工作的。这适用于大多数linux'es

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

这样做会使所有保修失效,我只会用它来进行调试。最好在malloc内存时存储值。