我的主要內容的一部分
int* p = NULL;
p = malloc(sizof(int)*10);
p = realloc(p, sizeof(int) * 5);
free(p);
有沒有辦法找出在重新分配后指標 p 是否指向大小為 20 位元組而不是 40 位元組的記憶體塊?
理想的情況是有一個函式,它將記憶體地址作為引數并告訴它是否已分配或空閑。有這樣的功能嗎?
另一個想法是檢查分配記憶體的 realloc() 之前和之后的大小。但我不知道 sizeof() 有什么幫助,因為我將如何識別記憶體塊, sizeof() 發送變數的大小而不是記憶體塊的大小。sizeof(p) 會給我 8 個位元組,因為 p 是一個指標而 sizeof(*p) 是 4,因為 p 指向一個整數。也許 sizeof() 或其他函式有特殊用途?
如果你想知道我為什么問,請閱讀更多...
如果我初始化我的 p 以保持/指向一個陣列
for (int i = 0; i < 3 ; i ){
p[i] = i;
}
我現在希望 p 只保存 {0,1,2},所以我想將 p 從 sizeof(int)* 5 重新分配到 sizeof(int)*3。但是假設我真的不知道 p 是否應該重新分配,記憶體塊是 20 個位元組,但也許它已經 12 個位元組了,并且不需要 realloc() 。我知道我可以以任何一種方式運行 realloc() 并且它不會受到傷害,所以也許這不是這個問題的一個很好的理由。但是在較長的代碼中,很容易忘記分配的記憶體量。
任何幫助都感激不盡。
PS 如果沒有人回答,我將不得不從 valgrind 發送 0 個錯誤中獲得滿足。畢竟,如果出現問題,例如寫入 20 位元組塊的第 21、22、23 和 24 位元組記憶體(例如:p[4] = 7)(因為 p = realloc(p, sizeof(int) * 5)) valgrind 發送型別為“大小為 4 的無效寫入”的錯誤,但要獲得該錯誤,我需要在此記憶體中寫入。這種驗證方法讓我想得到錯誤,因為如果我能準確地預測錯誤,那么我就知道分配的記憶體的實際大小。
uj5u.com熱心網友回復:
沒有可移植的方法來檢查它。
您需要自己保留尺寸資訊。
typedef struct String
{
size_t size;
int data[];
}data_type;
data_type *allocate(data_type *dt, size_t size)
{
if(!dt || dt -> size != size)
{
dt = realloc(dt, sizeof(*dt) size * sizeof(dt -> data[0]));
if(dt)
{
dt -> size = size;
}
}
return dt;
}
用法與realloc. 如果您傳遞 NULL 指標,它將為資料分配結構和空間。如果更改大小,將結果保存在臨時指標中并檢查分配是否失敗。如果請求的大小與實際分配的空間相同,它將什么都不做(因為不需要重新分配)
uj5u.com熱心網友回復:
有沒有辦法找出在重新分配后指標 p 是否指向大小為 20 位元組而不是 40 位元組的記憶體塊?
不
這種驗證方法讓我想得到錯誤,因為如果我能準確地預測錯誤,那么我就知道分配的記憶體的實際大小。
使用-fsanitize=address兩種編譯和連接。在此處閱讀更多資訊:https : //stackoverflow.com/a/40215639/6699433
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/369515.html
