Arrays 二维数组函数的C重分配
我的重新分配不起作用(11.element的分段错误),我想将数组放大两倍,列的长度根据第一次输入保持不变。我想在函数中分配。 在函数vztvorPole中,我分配了一个10行x列的数组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
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++;
}