我正在尝试为双精度类型数组分配内存以将其与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_data。
显然,malloc 之后的sizeof(x/y_e/i)
是 8,但应该在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(double*)
sizeof(x/y_e/i)
(正如其他用户所提到的),您的 for 循环不正确:
如果n_i + n_e == n_data
,那么您将始终遇到尝试访问x/y_e/i[i]
会使您越界的情况。为了避免这种情况,您可以分别跟踪x/y_e
的索引和x/y_i
的索引,可能如下所示:
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++;
}
}
在循环结束时,您应该发现i_e + i_i == n_data
并且分配给x_e/i
和y_e/i
的值是一致的。
首先,x_i
类型为double*
的sizeof(x_i)
是指针的大小(可能8
在您的系统上),而不是分配的内存大小。无法仅从指针获取指针指向的内存块的大小。
其次,数组中未设置的"变化值"是由于未初始化数组的这一部分引起的。实际上,您会产生未定义的行为,很可能在访问这些值时打印"垃圾"。要解决此问题,请使用calloc
而不是malloc
.calloc
初始化分配的内存块,并根据IEEE标准,所有位设置为0
的浮点值表示浮点值0.0
:
x_i = calloc(n_i, sizeof(double));