C - malloc 不适用于双精度型数组



我正在尝试为双精度类型数组分配内存以将其与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]的值不一致,它们会随着我更改归因顺序而变化,有时会返回-nandata[][]n_in_en_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/iy_e/i的值是一致的。

首先,x_i类型为double*sizeof(x_i)是指针的大小(可能8在您的系统上),而不是分配的内存大小。无法仅从指针获取指针指向的内存块的大小。

其次,数组中未设置的"变化值"是由于未初始化数组的这一部分引起的。实际上,您会产生未定义的行为,很可能在访问这些值时打印"垃圾"。要解决此问题,请使用calloc而不是malloc.calloc初始化分配的内存块,并根据IEEE标准,所有位设置为0的浮点值表示浮点值0.0

x_i = calloc(n_i, sizeof(double));

相关内容

  • 没有找到相关文章

最新更新