如果像这样初始化,则重新分配2d数组:char(* A)[size] = malloc(sizeof(char [size] [size]))

时间:2014-02-11 05:55:53

标签: c pointers dynamic multidimensional-array realloc

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那么我得到:

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

我看不到第一列的内容是如何被覆盖的。如果我不需要重新分配,一切正常。

2 个答案:

答案 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;
}