我试图为一个双类型数组分配内存,以便将其与GNU科学库一起使用。
用于此的代码类似于
double *x_i, *y_i, *x_e, *y_e, data[MAX_SIZE][2];
int n_i, n_e, n_data;
...
x_i = (double *)malloc(n_i * sizeof(double));
y_i = (double *)malloc(n_i * sizeof(double));
x_e = (double *)malloc(n_e * sizeof(double));
y_e = (double *)malloc(n_e * sizeof(double));
for (int i = 0; i < n_data; i++){
if (data[i][1] > 0){
x_e[i] = data[i][0];
y_e[i] = data[i][1];
}
else{
x_i[i] = data[i][0];
y_i[i] = data[i][1];
}
}
用n_i+n_e=n_数据。
显然,malloc 8岁以后,
sizeof(x/y_e/i)
应该是50*sizeof(double)
的范围。for循环之后归属于x_e/i[i]
和y_e/i[i]
的值不一致,它们随着我改变归属顺序而改变,有时返回-nan
。data[][]
、n_i
、n_e
和n_data
的值与我的预期一致,如果我在for循环内打印x_e/i[i]
和y_e/i[i]
值,它们看起来是正确的,但在该循环外它们会更改。谢谢你,如果这是一个多余或不好的问题,很抱歉。
最佳答案
除了实际返回sizeof(x/y_e/i)
(如其他用户所述),for循环不正确:
如果sizeof(double*)
,则您将始终遇到试图访问n_i + n_e == n_data
将使您超出界限的情况。为了避免这种情况,您可以分别跟踪x/y_e/i[i]
和x/y_e
的索引,可能如下所示:
int i_e = 0, i_i = 0;
for (int i = 0; i < n_data; i++){
if (data[i][1] > 0){
x_e[i_e] = data[i][0];
y_e[i_e] = data[i][1];
i_e++;
}
else{
x_i[i_i] = data[i][0];
y_i[i_i] = data[i][1];
i_i++;
}
}
循环结束时,您应该发现
x/y_i
和分配给i_e + i_i == n_data
和x_e/i
的值是一致的。关于c - c-malloc不适用于 double 类型数组,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46534211/