2011-12-12 58 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()將返回結構的大小,包括填充,但是要計算包括分配內存的總大小,您必須編寫自己的函數。爲此,您還需要記錄您分配的每種數據類型的數量,因爲在分配完成後無法告訴這些數據類型。