首页 > 解决方案 > 二维数组函数的C重新分配

问题描述

我的重新分配不起作用(11.element 的分段错误),我想将数组放大两次,根据第一个输入,列的长度是恒定的。我想在函数中分配。在函数 vztvorPole 中,我分配了一个 10 行 x 列的数组。

 char vytvorPole(char ***grid, int nrows, int ncols)
{
    *grid = malloc( sizeof(*grid)*nrows);
    
    if (*grid == NULL)
    {
        printf("ERROR\n");
        return 1;
    }
    
    for(int i=0;i<nrows;i++)
    {
        (*grid)[i]=(char *) malloc (ncols*sizeof(*grid));
        if((*grid)[i] == NULL)
        {
            printf("ERROR\n");
        return 1;
        }
    }
    return 0;
}
    char realokuj(char ***grid, int nrows, int ncols)
    {
        char **docasne;
        docasne = (char**)realloc (*grid, nrows*sizeof(*grid));
        
        for(int i=nrows/2;i<nrows;i++)
        {
            (docasne)[i]=(char *) malloc (ncols*sizeof(*grid));
            
        }
        *grid = docasne;
    }
    int main (void)
    {
        char **diagonaly;
        int rDiagonaly = 10;
        int cDiagonaly = -1;
    
        char *str = NULL;
        size_t  capacity = 0;
        int first = 1;
        int nr = 0;
        
        printf("Vypln:\n");
        while ( getline (&str, &capacity, stdin) != -1)
        {
            if(str[0] == '\n')
                    break;

            if (first)
            {
                cDiagonaly = strlen (str);
                vytvorPole(&diagonaly, rDiagonaly, cDiagonaly);
                first = 0;
            }   
        
            if (nr==rDiagonaly)
                {
                    rDiagonaly *= 2; 
                    realokuj(&diagonaly, rDiagonaly, cDiagonaly);
                }
            
            strcpy(diagonaly[nr],str);
            nr++;
            
        }
    
    }

标签: arrayscmalloc2drealloc

解决方案


这样的事情可以吗?

while ( getline (&str, &capacity, stdin) != -1)
    {
        if(str[0] == '\n')
            break;
        
        
        if (first)
        {
            cDiagonaly = strlen (str);
            diagonaly = (char**) malloc(sizeof(*diagonaly)*rDiagonaly);
            
        
        if (nr==rDiagonaly)
            {
                rDiagonaly *= 2; 
                docasne = (char**)realloc (diagonaly, rDiagonaly*sizeof(*diagonaly));
                diagonaly=docasne;
            }
        
        diagonaly[nr]=(char*) malloc (cDiagonaly*sizeof(**diagonaly));
        strcpy(diagonaly[nr],str);
        
        nr++;
        
    }

推荐阅读