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

San*_*raj 0 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;
}
Run Code Online (Sandbox Code Playgroud)

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

abe*_*nky 5

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

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

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

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

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


Oli*_*rth 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;
Run Code Online (Sandbox Code Playgroud)