#include <stdio.h>
#include <stdlib.h>
int main(void)
{
char * ptr1 = NULL;
char * newptr = NULL;
ptr1 = (char *) malloc(8 * sizeof(int));
if (ptr1 == NULL)
exit(EXIT_FAILURE);
printf("%p\n", ptr1);
newptr = ptr1 - sizeof(size_t);
printf("%zu\n", (*(size_t *)newptr));
free(ptr1);
return 0;
}
輸出 :
0x...... [some address]
49
49 - 1 = 48 - (8 * 4) = 16
假設sizeof(int)= 4
根據glibc malloc()實作,每個塊的最大開銷是8 bytes
但是這個塊欄位的大小48減去了可用的記憶體16。所以開銷正在顯示16 bytes。我知道出了點問題,但我無法弄清楚我在哪里做錯了計算。
請幫忙。謝謝你。
uj5u.com熱心網友回復:
這是實作定義的事情之一,除了實驗或研究目的之外,您不應該搞砸。
在GNU平臺中,一個函式存在于一個malloc.h名為位元組可以被應用程式覆寫而不會產生不良影響,這不是好的編程習慣:分配中多余位元組的數量取決于底層實作。 ”malloc_usable_size()malloc()malloc()
根據 C 標準,malloc()由. 我記得我的一位計算機科學教授演示了如何在指標從她的系統上傳遞之前查看記憶體,malloc()就像您正在讀取有關記憶體塊的資訊一樣,但是不需要malloc()實作C 編程語言這種方式也不保證如何對任何此類資料進行編碼。
看來您正在使用 GNU,所以如果您想了解更多關于如何malloc()在您的平臺上實作的資訊,malloc_usable_size()請查看一下當您要求 32 時它是否真的給了您 48 位元組。為了記錄,我不會如果是的話,我會很驚訝。
當您說 glibc 中的最大開銷是 8 位元組時,我不確定您指的是什么。這可能意味著堆管理器為每個塊使用的最大記憶體是 8 位元組,不包括為對齊分配的額外記憶體?
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/456845.html
上一篇:將命令列的輸出重定向到C中的變數
下一篇:將數字讀入陣列并排序
