Arrays 二维数组函数的C重分配

Arrays 二维数组函数的C重分配,arrays,c,malloc,2d,realloc,Arrays,C,Malloc,2d,Realloc,我的重新分配不起作用(11.element的分段错误),我想将数组放大两倍,列的长度根据第一次输入保持不变。我想在函数中分配。 在函数vztvorPole中,我分配了一个10行x列的数组 char vytvorPole(char ***grid, int nrows, int ncols) { *grid = malloc( sizeof(*grid)*nrows); if (*grid == NULL) { printf("ERRO

我的重新分配不起作用(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++;
            
        }
    
    }
char vytvorPole(char***grid,int nrows,int ncols)
{
*网格=malloc(sizeof(*网格)*nrows);
如果(*网格==NULL)
{
printf(“错误\n”);
返回1;
}

对于(inti=0;i,您的代码比需要的要复杂一些

如果初始化
diagnonaly
(例如
char**diagnoaly=NULL;
),可以消除
vytvorPole
,只需使用
realokuj
。也就是说,如果您也这样做:
int rDiagonaly=0;

这是因为
realloc
可以很好地处理
NULL
指针(即,在这种情况下,它相当于
malloc

而且,您不需要这样做:

(docasne)[i]=(char *) malloc (ncols*sizeof(*grid));
在子功能中

最好在
main
中使用
strdup
。如果这样做,我们根本不需要
cd对角线的
。而且,我们可以拥有不同长度的字符串

传递三星指针(例如,
char***grid
)有问题。您可以将其作为
char**
传递,并使用
return
更新该值,因为您实际上不使用现有的返回值

但是,这确实可以通过
main
完成,而不需要单独的函数

虽然可以修复现有代码,但实际上应该简化:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int
main(void)
{
#if 0
    char **diagonaly;
    int rDiagonaly = 10;
#else
    char **grid = NULL;
    int rmax = 0;
#endif
#if 0
    int cDiagonaly = -1;
#endif

    char *str = NULL;
    size_t capacity = 0;
#if 0
    int first = 1;
#endif
    int nr = 0;

    printf("Vypln:\n");
    while (getline(&str,&capacity,stdin) != -1) {
        if (str[0] == '\n')
            break;

        if (nr == rmax) {
            rmax += 100;

            grid = realloc(grid,sizeof(*grid) * (rmax + 1));
            if (grid == NULL) {
                perror("realloc");
                exit(1);
            }

            // this is similar to what you did, but it's not necessary because
            // of "grid[nr] = NULL;" below
#if 0
            for (int idx = nr;  idx < rmax;  ++idx)
                grid[idx] = NULL;
#endif
        }

        grid[nr++] = strdup(str);
        grid[nr] = NULL;
    }

    return 0;
}

这样可以吗

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++;
        
    }

是什么让您认为它“不起作用”?11的分段错误(内核转储)。元素首先,函数中的两个
sizeof(*grid)
是错误的!第一个应该是
sizeof(**grid)
,第二个应该是
sizeof(***grid)
,除非我大错特错。由于您正在对输入数据执行
getline
,您是否可以[在单独的代码块中]发布导致SEGFULT的输入数据?哪一行导致SEGFULT?如果您使用
-g
编译以获得调试符号,您可以使用(例如)调用
gdb./myprogram
。然后,执行
run
。当segfault发生时,执行
bt
以获取堆栈回溯。这应该会显示问题所在的行。您可以检查[相关]变量的值。您可以看到我添加的内容(答案)。我不确定是否会按照我需要的方式使用您的代码。它们现在基本上是相同的(除了您在第一次分配时使用
malloc
)。因此,我不确定您认为它们有什么不同。您在理解
#如果0
?这只是为了显示旧代码与新代码(它被
cpp
消除).我已经很长时间没有编程了,所以我对它的了解不多,谢谢你。好吧,祝你好运。每个人都有机会开始。它确实变得容易了。
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++;
        
    }