2011-07-26 83 views

回答

3

這是一個深奧的祕密,只有免費()知道肯定。它可能在你的系統中,但是完全依賴於實現。

有點彆扭,但如果你想保留一切融合在一起:

typedef struct 
{ // size of data followed by data (C only trick! NOT for C++) 
    int  dimension; // number of data elements 
    int  data[1];  // variable number of data elements 
} malloc_int_t; 

malloc_int_t *ab; 

int dimension = 10; 
ab = malloc(sizeof(*ab) + (dimension-1)*sizeof(int)); 
ab->dimension = dimension; 

ab->data[n] // data access

我已經改變了數據類型INT使代碼更通用的模板。

+0

即使免費()也不一定知道。 malloc(10)實際上可以分配16個字節; free()只需要知道實際分配的16個字節,而不需要10個字節。 –

+0

是的......我認爲這是「特定實施」的一部分。 – Gilbert

0

大小是你傳入malloc的大小,你可以使用全局變量或宏來記住它。

1

不,不幸的是。

您需要將塊的大小與指針一起傳遞。

1

有沒有辦法,你必須將分配的內存的大小存儲在另一個變量。

2

你不能(可移植地反正)。你必須自己跟蹤尺寸。

malloc的某些實現可能會爲您提供訪問該信息的API,但標準中沒有關於此的規定。

7

不,你沒有一個標準的方法來做到這一點。您必須將指針內存的大小與指針一起傳遞,這是一個常見的解決方案。

I.e.的

void f(char* x) 
{ 
    //... 
} 

使用

void f(char *x, size_t length) 
{ 
    //.... 
} 

,而不是在你的代碼

char *ab = malloc(10); 
f(ab, 10); 
+4

我會建議函數原型爲void f(char * x,size_t length)'。 'size_t'更好地表示了被傳遞的值的類型,並且還與'malloc'參數的類型匹配。 –

0

有沒有辦法從指針本身推斷分配內存的大小。由於abchar *,sizeof(ab)sizeof(char *)相同,這顯然不同於分配的內存塊的大小。

既然你用所需的尺寸調用malloc,你就知道尺寸是多少。將此編號與指向需要知道尺寸的函數的指針一起傳遞。

1

現在,他這樣說,也有不可移植的黑客要做到這一點,但它不是安全的依靠他們。

如果您完全知道內存是通過malloc()分配的,那麼您可以將指針倒回幾個字節,然後檢查用於跟蹤內存哪些部分的'malloc節點'分配,哪些沒有。但是,我無法強調這一點 - 不要依賴於此。

0

我有一個結構和一個char指針指向它的內存地址。因此,將它與您的問題相關聯,我想找到它指向的內存位置的大小,即結構的大小。因此,邏輯上你所做的是找到指針創建的對象的大小。這對我有效:

unsigned char * buffer= Library1Structure; 
int x=sizeof(Library1Structure); 

所以x的值告訴我指針緩衝區指向的內存位置的大小。

+0

我需要知道在不同功能的尖端內存的大小,我無法訪問「Library1Structure」 –

+0

在頭文件中聲明library1structure然後... –