在一個功能我已經寫:如何計算指針指向內存的大小?
char *ab;
ab=malloc(10);
然後在另一個功能,我想知道的內存由ab
指針指向大小。 有沒有什麼辦法可以知道ab
指向10個字符的內存?
在一個功能我已經寫:如何計算指針指向內存的大小?
char *ab;
ab=malloc(10);
然後在另一個功能,我想知道的內存由ab
指針指向大小。 有沒有什麼辦法可以知道ab
指向10個字符的內存?
這是一個深奧的祕密,只有免費()知道肯定。它可能在你的系統中,但是完全依賴於實現。
有點彆扭,但如果你想保留一切融合在一起:
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使代碼更通用的模板。
大小是你傳入malloc
的大小,你可以使用全局變量或宏來記住它。
不,不幸的是。
您需要將塊的大小與指針一起傳遞。
有沒有辦法,你必須將分配的內存的大小存儲在另一個變量。
你不能(可移植地反正)。你必須自己跟蹤尺寸。
malloc
的某些實現可能會爲您提供訪問該信息的API,但標準中沒有關於此的規定。
不,你沒有一個標準的方法來做到這一點。您必須將指針內存的大小與指針一起傳遞,這是一個常見的解決方案。
I.e.的
void f(char* x)
{
//...
}
使用
void f(char *x, size_t length)
{
//....
}
,而不是在你的代碼
char *ab = malloc(10);
f(ab, 10);
我會建議函數原型爲void f(char * x,size_t length)'。 'size_t'更好地表示了被傳遞的值的類型,並且還與'malloc'參數的類型匹配。 –
有沒有辦法從指針本身推斷分配內存的大小。由於ab
是char *
,sizeof(ab)
與sizeof(char *)
相同,這顯然不同於分配的內存塊的大小。
既然你用所需的尺寸調用malloc
,你就知道尺寸是多少。將此編號與指向需要知道尺寸的函數的指針一起傳遞。
號
現在,他這樣說,也有不可移植的黑客要做到這一點,但它不是安全的依靠他們。
如果您完全知道內存是通過malloc()分配的,那麼您可以將指針倒回幾個字節,然後檢查用於跟蹤內存哪些部分的'malloc節點'分配,哪些沒有。但是,我無法強調這一點 - 不要依賴於此。
我有一個結構和一個char指針指向它的內存地址。因此,將它與您的問題相關聯,我想找到它指向的內存位置的大小,即結構的大小。因此,邏輯上你所做的是找到指針創建的對象的大小。這對我有效:
unsigned char * buffer= Library1Structure;
int x=sizeof(Library1Structure);
所以x的值告訴我指針緩衝區指向的內存位置的大小。
我需要知道在不同功能的尖端內存的大小,我無法訪問「Library1Structure」 –
在頭文件中聲明library1structure然後... –
即使免費()也不一定知道。 malloc(10)實際上可以分配16個字節; free()只需要知道實際分配的16個字節,而不需要10個字節。 –
是的......我認爲這是「特定實施」的一部分。 – Gilbert