Перераспределение двумерного массива, если он инициализирован следующим образом: 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 ответа:
Мое предложение разделить части отображения гистограммы так,чтобы использовать динамический массив входных данных массива.
#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]
. размер !