动态分配数组的push_front函数的这两种实现有什么区别? (malloc 与 realloc)

问题描述 投票:0回答:1

你能解释一下为什么第一个函数不能正常工作吗?

我写了两个相同的函数:

bool push_front(int value, size_t *size, int **arr) {
    if (!*arr) return false;
    int *new_arr = realloc(*arr, sizeof(int[*size + 1]));
    if (!new_arr) return false;
    new_arr[0] = value;
    for (size_t i = 1, j = 0; j < *size; ++i, ++j)
        new_arr[i] = (*arr)[j];
    ++*size;
    *arr = new_arr;
    return true;
}

bool push_front(int value, size_t *size, int **arr) {
    if (!*arr) return false;
    int *new_arr = malloc(sizeof(int[*size + 1]));
    if (!new_arr) return false;
    new_arr[0] = value;
    for (size_t i = 1, j = 0; j < *size; ++i, ++j)
        new_arr[i] = (*arr)[j];
    ++*size;
    free(*arr);
    *arr = new_arr;
    return true;
}

第一个确实添加了一个元素,但它也将所有数组元素重写为“值”。有什么想法为什么会发生吗?

arrays c memory-management
1个回答
2
投票

第一种使用

realloc
的方法有多个问题:

  • 如果数组为空,您可能需要分配一个单例
  • 在将元素向右移动一个位置之前覆盖第一个元素
  • 您在重新分配数组后阅读
    (*arr)[i]
    :如果块被重新分配到不同的地址,
    *arr
    可能是无效指针。
  • 将元素从第一个位置复制到右侧:每个元素在复制之前都会被覆盖,导致所有元素接收相同的值
    value

这是修改后的版本:

bool push_front(int value, size_t *size, int **arr) {
    if (!*size && !*arr) {
        int *new_arr = malloc(sizeof(int));
        if (!new_arr)
            return false;
    } else {
        if (!*arr)
            return false;
        int *new_arr = realloc(*arr, sizeof(int[*size + 1]));
        if (!new_arr)
            return false;
        for (size_t i = *size; i > 0; i--)
            new_arr[i] = new_arr[i - 1];
    }
    new_arr[0] = value;
    ++*size;
    *arr = new_arr;
    return true;
}
© www.soinside.com 2019 - 2024. All rights reserved.