内存分配函数返回的点

Points returned by memory allocation functions

我正在从 K.N.King 的书中学习 C,并且正在完成第 17 章的编程项目。我在完成第一个项目时遇到了一个自己造成的错误。这是程序的未定义行为,因为我正在传递 realloc() 一个从较早的 malloc() 调用返回的指针的 copy,因为 realloc() 调用发生在其他函数中比主要()。在重新阅读本章的部分内容后,我意识到 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");
    }
    \...
}

函数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 我们可以直接访问原始指针(对象),从而可以更改它。