1

我正在尝试删除,realloc但它没有按我预期的方式工作......

void deallocates(int** v, int size, int original_size) {
    int i;

    *v = (int*)realloc(*v, sizeof(int) * size);
    printf("\nAFTER REALLOC FOR SIZE = %d\n", size);

    for (i = 0; i < original_size; i++) {
        printf("%d ", (*v)[i]);
    }
}

int main() {
    int i, *v, size, original_size;

    srand(time(NULL));

    printf("size of the vector: ");
    scanf("%d", &original_size);

    v = (int *)malloc(sizeof(int) * original_size);

    printf("before realloc...\n");

    for (i = 0; i < original_size; i++) {
        v[i] = rand() % 100;
        printf("%d ", v[i]);
    }
    size = original_size;

    for (i = 1; i < size; i++)
        deallocates(&v, size - i, original_size);
}

我想删除的值有时会保留。请在我的代码输出中查看这张照片。我在让我烦恼的线条上画了一个红色标记: https ://ibb.co/C1TMHF5

4

1 回答 1

0

您的代码具有未定义的行为,因为您访问的内存超出了分配块的末尾。您无法安全地检查超出重新分配对象的新大小的字节。

这是修改后的版本:

#include <stdio.h>
#include <stdlib.h>

void deallocates(int **v, int size) {
    int *newptr;
    int i;

    newptr = realloc(*v, sizeof(int) * size);
    printf("After realloc for size=%d:", size);
    if (newptr == NULL) {
        printf(" reallocation failure\n");
    } else {
        *v = newptr;
        for (i = 0; i < size; i++) {
            printf(" %d", (*v)[i]);
        }
        printf("\n");
    }
}

int main() {
    int i, *v, size, original_size;

    srand(time(NULL));

    printf("size of the vector: ");
    if (scanf("%d", &original_size) != 1)
        return 1;

    v = malloc(sizeof(int) * original_size);
    if (v == NULL)
        return 1;

    printf("Before realloc: ");
    for (i = 0; i < original_size; i++) {
        v[i] = rand() % 100;
        printf(" %d", v[i]);
    }
    printf("\n");

    size = original_size;
    for (i = 1; i < size; i++)
        deallocates(&v, size - i);
    free(v);
    return 0;
}

输出:

向量大小:10
重新分配之前:64 90 47 15 62 4 19 67 95 5
在重新分配 size=9 后:64 90 47 15 62 4 19 67 95
在重新分配 size=8 后:64 90 47 15 62 4 19 67
在重新分配 size=7 后:64 90 47 15 62 4 19
在重新分配 size=6 后:64 90 47 15 62 4
在重新分配 size=5 后:64 90 47 15 62
在重新分配 size=4 后:64 90 47 15
在重新分配 size=3 后:64 90 47
在重新分配 size=2 后:64 90
在重新分配 size=1 后:64
于 2019-03-31T16:15:57.367 回答