Перераспределение двумерного массива, если он инициализирован следующим образом: char (*A) [size] = malloc (sizeof(char [size][size]))


char (*A)[size] = malloc(sizeof(char[size][size]));

Если я инициализирую размер как 10, но в конечном итоге мне нужно больше памяти, как я могу перераспределить память для A без потери ее содержимого?

Я попробовал что-то вроде этого:

char (*B)[sizeColumns] = realloc(A, sizeof(char[sizeColumns][sizeColumns]));
A = B;
Я начинаю сталкиваться с проблемами, когда мне нужно перераспределить ресурсы.
char linearray[1025];
char *line;
int stars = 0;
int sizeColumns = 4;
int usedColumns = 0;
char (*A)[sizeColumns] = malloc(sizeof(char[sizeColumns][sizeColumns]));
int i;
int j;
int rows = 5;

for(i = 0; i < rows; i++ ){
    if(i==0){
        A[i][0] = '+';
    }
    else{
        A[i][0] = '|';
    }
}
usedColumns++;
while(fgets(linearray,1024,stdin) != NULL){
    line = linearray;
    sscanf(line,"%d", &stars);
    if (usedColumns == sizeColumns) {
        sizeColumns *= 2;
        char (*B)[sizeColumns] = realloc(A, sizeof(char[sizeColumns][sizeColumns]));
        A = B;
    }
    for(i = 0; i < stars +1; i++ ){
        if(i==0){
            A[i][usedColumns] = '-';
        }
        else{
            A[i][usedColumns] = '*';
        }
    }
    usedColumns++;
}

Если я ввожу 1,2,3,4 выше, я хочу:

+----
|****
| ***
|  **
|   *

Который я могу успешно вывести, если я инициализирую sizeColumns как 5 выше, но если это 4, то я получаю:

+----
-****
*?***
*  **
*   *

Я не вижу, каково содержание первой колонки. быть перезаписанным. Опять же все работает нормально, если мне не нужно перераспределять.

2 2

2 ответа:

Мое предложение разделить части отображения гистограммы так,чтобы использовать динамический массив входных данных массива.


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

#define MAX_DATA_SIZE 80 //console width is 80 :)

void histogram(int n, int data[n], int max){
    char (*disp)[n+1] = malloc(sizeof(char [max+1][n+1]));//Area for display is actually not required.
    int r,c;
    for(r = 0;r <= max; ++r){
        for(c = 0; c <= n; ++c){
            if(c == 0){
                if(r == 0)
                    disp[r][c] = '+';
                else
                    disp[r][c] = '|';
            } else if(r == 0){
                disp[r][c] = '-';
            } else {
                disp[r][c] = r <= data[c-1] ? '*' : ' ';
            }
        }
    }
    for(r = max; r>=0;--r){
        for(c =0;c<=n;++c)
            printf("%c", disp[r][c]);
        printf("\n");
    }
}

int main(void){
    int data[MAX_DATA_SIZE], max_data = 0;
    char input_line[128];
    int data_size = 0;
    while(fgets(input_line, sizeof(input_line), stdin)){
        if(sscanf(input_line, "%d", &data[data_size])==1){
            if(data[data_size] > max_data)
                max_data = data[data_size];
            if(++data_size == MAX_DATA_SIZE)
                break;//or malloc & realloc ?
        }
    }
    histogram(data_size, data, max_data);
    return 0;
}

Расположение памяти в таком случае линейно.

Например [4] [4]

Изображение 2D массива:

AAAA
BBBB
CCCC
DDDD

Размещение в памяти:

AAAABBBBCCCCDDDD

Память расширяется ([5][5]) на realloc:

AAAABBBBCCCCDDDDXXXXXXXXX

Интерпретация двумерного массива ([5][5]) как в этом случае:

AAAAB
BBBCC
CCDDD
DXXXX
XXXXX

Проверочный код:

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

int main(void){
    int i,j;
    char (*A)[4] = malloc(sizeof(char[4][4]));
    for(i=0;i<4;++i){
        for(j=0;j<4;++j){
            A[i][j]=i+'A';
            printf("%c", A[i][j]);
        }
        printf("\n");
    }
    printf("*\n");
    char (*B)[5] = realloc(A, sizeof(char[5][5]));
    memset((char*)B+sizeof(char[4][4]), 'X', sizeof(char[5][5])-sizeof(char[4][4]));
    for(i=0;i<5;++i){
        for(j=0;j<5;++j){
            printf("%c", B[i][j]);
        }
        printf("\n");
    }

    return 0;
}

Таким образом, вместо того, чтобы расширять целое, есть необходимость увеличивать каждую строку.

Также обратите внимание, что когда A = B, тип A является (*)[size]. размер !