char (*A)[size] = malloc(sizeof(char[size][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那么我得到:
+----
-****
*?***
* **
* *
我看不到第一列的内容是如何被覆盖的。如果我不需要重新分配,一切正常。
答案 0 :(得分:3)
在这种情况下,记忆的排列是线性的。
例如[4] [4]
2D阵列的图像:
AAAA
BBBB
CCCC
DDDD
作为记忆放置:
AAAABBBBCCCCDDDD
内存被放大([5] [5])realloc
:
AAAABBBBCCCCDDDDXXXXXXXXX
解释2D数组([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]
。的尺寸强>!
答案 1 :(得分:1)
我建议将直方图显示部分分开,以便使用动态数组输入数据数组。
#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;
}