2011-12-12 55 views
0

在C,说你有以下的结构和某个实例: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分配的内存总和。如何在内存中找到这个结构的总大小(包括填充如果适用)?

回答

4

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

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

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

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

要做你在问什么,我认为你需要一种反思/内省的语言,比如Java或.Net(C#)。

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; 
0

一个非常非常不标准的方式这样做的目的是弄清楚你的系统malloc是如何工作的。这对大多数linux's都有效

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

虽然这样做会使所有保修无效,但我只会将其用于调试。尽管存储malloc的时候最好存储这个值。

+0

@OliCharlesworth - 我做了:-) - 重写了答案 –

2

sizeof()将考虑到必要的填充。然而,它并不是“深”的sizeof,这意味着它不会遵循指针/引用,也不会包含指向对象的大小,包括示例中的a1 ... a3数组。

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

1

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