在 C 中调整二维数组的大小。内存泄漏

Resizing a two dimensional array in C. Memory leak

所以我有一个二维动态数组,我必须调整它的大小。在我调整它的大小之后,编译器说它不能通过这样的格式访问内存:array[i][j]

void resize(int **array,int newsize,int size){
    int newarraysize=WINDOWY/newsize;
    int arraysize=WINDOWY/size;
    array= (int**)realloc(array,(newarraysize*sizeof(int*)));

    if(newarraysize>arraysize){
        for(int i=0; i<arraysize; i++)
         array[i]=(int*)realloc(tomb[i],(newarraysize*sizeof(int)));
    }
    else{
        for(int i=0; i<newarraysize; i++)
         array[i]=(int*)realloc(tomb[i],(newarraysize*sizeof(int)));
    }
    printf("\n");
    for(int i=0;i<newarraysize;i++)
        {
            for(int j=0;j<newarraysize;j++)
            printf("[%d][%d]: %p ",i,j,&array[i][j]);
            printf("\n");
        }
}

如果newsize较小,则newsize到size的元素必须释放
然后可以重新分配数组。
如果newsize比较大,size到newsize的元素需要设置为NULL。
然后从元素 0 重新分配到 newsize。
对于指向指针的指针,可以返回和分配指针。另一种选择是将指针传递给指针 int ***array.

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

int **resize ( int **array, int *newsize, int size){
    int **temp = NULL;

    if ( *newsize < size) {
        for ( int i = *newsize; i < size; i++) {
            printf ( "free[%d]\n", i);
            free ( array[i]);
        }
    }

    if ( NULL == ( temp = realloc ( array, *newsize * sizeof *array))) {
        if ( 0 != *newsize) {
            fprintf ( stderr, "realloc problem\n");
            *newsize = size;
            return array;
        }
        else {
            return NULL;
        }
    }
    array = temp;

    for ( int i = size; i < *newsize; i++) {
        array[i] = NULL;
    }

    for ( int i = 0; i < *newsize; i++) {
         array[i] = realloc ( array[i], *newsize * sizeof **array);
    }
    printf("\n");
    for ( int i = 0; i < *newsize; i++) {
        for ( int j = 0; j < *newsize; j++) {
            printf ( "[%d][%d]: %p\n", i, j, (void *)&array[i][j]);
        }
    }
    return array;
}

int main ( void) {
    char line[6] = "";
    int **items = NULL;
    int elements = 0;
    int oldsize = 0;

    printf ( "enter a number\n");
    while ( fgets ( line, sizeof line, stdin)) {
        if ( 1 == sscanf ( line, "%d", &elements)) {
            if ( 0 <= elements) {
                items = resize ( items, &elements, oldsize);
                oldsize = elements;
            }
            if ( 0 == elements) {
                free ( items);
                break;
            }
        }
        else {
            printf ( "enter a number\n");
        }
    }

    return 0;
}