动态分配的整数数组在 realloc() 或(双重释放或损坏错误)之后产生奇怪的输出

问题描述 投票:0回答:1
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <unistd.h>

size_t array_resize(int64_t **array, size_t array_size, size_t resize_num) {
    size_t new_size = array_size + resize_num;
    int64_t *temp = realloc(*array, sizeof(int64_t) * resize_num);
    if (temp == NULL) {
        printf("failed realloc\n");
        free(array);
        exit(1);
    }
    *array = temp;
    free(temp);
    return new_size;
}

int main(void) {
    int array_size = 10;
    int64_t *array;
    array = malloc(array_size * sizeof(int64_t));

    for (int i = 0; i < array_size; i++) {
        array[i] = i + 1;
    }
    for (int i = 0; i < array_size; i++) {
        printf("%li ", array[i]);
    }
    printf("\n");

    array_size = array_resize(&array, array_size, 15);
    
    for (int i = 0; i < array_size; i++) {
        array[i] = i + 1;
    }
    for (int i = 0; i < array_size; i++) {
        printf("%li ", array[i]);
    }
    printf("\n");
    free(array);

    return 0;
}

这段代码产生了我所希望的输出:

1 2 3 4 5 6 7 8 9 10 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25

但是如果我改变大小,使数组变得更大,例如:

(...)
    array_size = array_resize(&array, array_size, 5);
(...)

输出更改为我不明白的内容:

1 2 3 4 5 6 7 8 9 10 
1 2 3 4 5 6 7 8 9 10 11 12 2320515111958224945 2321641029045198901 2319689297389756473

导致问题的另一种情况是这样的:

(...)
array_size = array_resize(&array, array_size, 130);
(...)

这是输出:

1 2 3 4 5 6 7 8 9 10 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 
double free or corruption (top)
Aborted (core dumped)

我发现了初始数组大小和我增加产生此行为的数组的大小的其他几种组合。我的错误是什么?

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

您正在释放新分配的数组:

    *array = temp;
    free(temp);

这完全违背了

array_resize()
函数的明显目的。当函数返回时,调用者的指针无效,其值曾经指向的已分配对象的生命周期甚至在函数返回之前就已结束。您不妨跳过重新分配和错误检查,然后

    free(*array);

或者 删除

free
调用。这更有可能让您的行为符合您的期望。

这段代码产生了我所希望的输出:

这是程序未定义行为的可能表现之一。

但是如果我改变数组的大小[...],输出就会变成我不明白的东西

这也是程序未定义行为的可能表现之一。

© www.soinside.com 2019 - 2024. All rights reserved.