【问题标题】:Reallocating a 2d array if initialized like so: char (*A)[size] = malloc(sizeof(char[size][size]))如果像这样初始化,则重新分配二维数组: char (*A)[size] = malloc(sizeof(char[size][size]))
【发布时间】:2014-03-08 18:55:35
【问题描述】:
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,那么我得到:

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

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

【问题讨论】:

  • 不推荐以这种方式在 c 中重新分配二维数组。您失去了列/行的一致性。
  • 工作正常如果输入列大小或更高的数量,它会访问超出范围的数组。

标签: c pointers dynamic multidimensional-array realloc


【解决方案1】:

这种情况下的内存排列是线性的。

例如 [4][4]

二维数组的图像:

AAAA
BBBB
CCCC
DDDD

放置作为记忆:

AAAABBBBCCCCDDDD

内存被realloc扩大([5][5]):

AAAABBBBCCCCDDDDXXXXXXXXX

2D Array([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]大小

【讨论】:

    【解决方案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;
    }
    

    【讨论】:

      猜你喜欢
      • 2013-03-05
      • 1970-01-01
      • 2019-03-24
      • 1970-01-01
      • 2021-03-19
      • 2012-06-03
      • 1970-01-01
      • 2021-09-28
      • 2013-07-28
      相关资源
      最近更新 更多