在C中重新分配双2D数组

我写了一个函数,它应该为每个输入重新分配数组。 我认为这个function运行良好,但是当我尝试使用数组时,我得到了分段错误。

输入:

[1,2] [6,3] [2.5,3.5] 

我必须检查用户是否以正确的forms'[' number ',' number ']'输入输入。 我必须至少有2个条目。 输入的结尾不是新行,而是EOF( CTRL + DCTRL + Z )。

我的代码:

 double ** allocation (double ** field, int i) { double x = 0, y = 0; char obr[1], cbr[1], col[1]; while (scanf("%c%lf%c%lf%c", &obr, &x, &col, &y, &cbr) == 5) { if (col[0] != ',' || obr[0] != '[' || cbr[0] != ']') return 0; field = (double **) realloc(field, (i + 1) * sizeof(*field)); if (field == NULL) return 0; field[i] = (double *)malloc(2 * sizeof(double)); if (field[i] == 0) return 0; field[i][0] = x; field[i][1] = y; i++; } if (feof (stdin)) return 0; return field; } 

当我想用这个时:

 double min = sqrtf(powf(field[0][0] - field[1][0], 2) + powf(field[0][1] - field[1][1], 2)); 

我会得到我的分段错误。

来自man realloc (强调我的):

realloc()函数尝试将ptr指向的分配大小更改为size,并返回ptr。 如果没有足够的空间来扩大ptr指向的内存分配, realloc()会创建一个新的分配 ,复制ptr指向的旧数据,以适应新的分配,释放旧的分配,并返回指向已分配内存的指针。

当您使用realloc ,不能保证使用相同的内存,您需要将指针传回给它已被移动到新位置的情况。 您也可以通过检查它是否为NULL指针来检查是否成功。

tl; dr :您需要使用return field而不是return 1return 0