我正在從 KNKing 的書中學習 C,并且正在閱讀第 17 章的編程專案。我在完成第一個專案時遇到了一個自我造成的錯誤。這是程式的未定義行為,因為我向 realloc() 傳遞了從早期 malloc() 呼叫回傳的指標的副本,因為 realloc() 呼叫發生在 main() 以外的函式中。在重新閱讀本章的部分內容后,我意識到 realloc() 在這種情況下具有未定義的行為。
我試圖搜索為什么會這樣,但無濟于事。那么這里有誰知道為什么傳遞給 realloc() 的指標必須是從先前呼叫 malloc()、calloc() 或 realloc() 回傳的指標,而不是這些的副本?另外,當我們想要調整記憶體塊的大小時,我們不是天生就總是復制 realloc() 回傳的指標嗎?
int num_parts = 0, max_parts = 10;
int main(void)
{
struct part *inventory = malloc(max_parts * sizeof(*inventory));
\\...
switch(ch) {
\\...
case 'i':
insert(inventory, &num_parts, &max_parts);
break;
\\...
}
}
void insert(struct part *inventory, int *num_parts, *max_parts)
{
if (*num_parts == *max_parts) {
*max_parts = 10;
struct part *temp = realloc(inventory, max_parts * sizeof(*temp));
if (temp != NULL)
inventory = temp;
else
printf("Error:...\n");
}
\\...
}
uj5u.com熱心網友回復:
該函式按值insert接受指標inventory
void insert(struct *inventory, int *num_parts, *max_parts)
和
insert(inventory, &num_parts, &max_parts);
這意味著該函式處理原始指標值的副本。在函式中更改副本,例如
if (temp != NULL)
*inventory = temp;
不影響 main 中宣告的原始指標的值。
您需要通過指向它的指標通過參考傳遞指標。
那是
insert( &inventory, &num_parts, &max_parts);
該功能看起來像
void insert(struct **inventory, int *num_parts, *max_parts)
{
if (*num_parts == *max_parts) {
*max_parts = 10;
struct part *temp = realloc( *inventory, max_parts * sizeof(*temp));
if (temp != NULL)
*inventory = temp;
else
printf("Error:...\n");
}
\\...
}
在這種情況下,取消參考函式struct **inventory中的函式引數,我們可以直接訪問原始指標(物件),從而可以更改它。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/486433.html
上一篇:獲取類的方法地址
