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