我编写了一个函数,该函数应该为每个输入重新分配数组。我认为这个函数运行得很好,但当我尝试使用数组时,我遇到了分段错误。
输入:
[1,2] [6,3] [2.5,3.5]
我必须检查用户是否以正确的形式 我的代码: 当我想使用这个: 我会得到我的分割错误。'[' number ',' number ']'
输入了输入。我必须至少有两个条目。输入的末尾不是新行,而是EOF(CTRL+D或1CTRL+Zdouble ** 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()函数试图更改所指向的分配的大小to by ptr to size,并返回ptr。如果没有足够的空间放大ptr指向的内存分配,realloc()创建一个新的allocation,复制ptr指向的尽可能多的旧数据指向新的分配,释放旧的分配,并返回一个指向分配的内存。
在使用realloc
时,不能保证使用相同的内存,如果指针已移动到新位置,则需要将其传回。您也可以通过检查它是否为NULL指针来检查是否成功。
tl;dr:您需要使用return field
而不是return 1
或return 0
。