重新分配記憶體

在為其分配記憶體後,可能需要擴充套件或縮小指標儲存空間。void *realloc(void *ptr, size_t size) 函式釋放 ptr 指向的舊物件,並返回指向 size 指定大小的物件的指標。ptr 是指向先前分配有要重新分配的 malloccallocrealloc(或空指標)的記憶體塊的指標。保留原始記憶體的最大可能內容。如果新大小較大,則超出舊大小的任何其他記憶體都是未初始化的。如果新尺寸較短,則收縮部分的內容將丟失。如果 ptr 為 NULL,則分配一個新塊,並由該函式返回指向它的指標。

#include <stdio.h>
#include <stdlib.h>
 
int main(void)
{
    int *p = malloc(10 * sizeof *p);
    if (NULL == p) 
    {
        perror("malloc() failed");
        return EXIT_FAILURE;
    }
 
    p[0] = 42;
    p[9] = 15;

    /* Reallocate array to a larger size, storing the result into a
     * temporary pointer in case realloc() fails. */
    {
        int *temporary = realloc(p, 1000000 * sizeof *temporary);

        /* realloc() failed, the original allocation was not free'd yet. */
        if (NULL == temporary)
        {
            perror("realloc() failed");
            free(p); /* Clean up. */
            return EXIT_FAILURE;
        }      

        p = temporary;
    }

    /* From here on, array can be used with the new size it was 
     * realloc'ed to, until it is free'd. */

    /* The values of p[0] to p[9] are preserved, so this will print:
       42 15
    */
    printf("%d %d\n", p[0], p[9]);

    free(p);

    return EXIT_SUCCESS;
}

重新分配的物件可能與*p 具有相同或不同的地址。因此,如果呼叫成功,從 realloc 捕獲包含新地址的返回值非常重要。

確保將 realloc 的返回值分配給 temporary 而不是原始的 p。如果發生任何故障,realloc 將返回 null,這將覆蓋指標。這會丟失你的資料並造成記憶體洩漏。