c-malloc不适用于双类型数组

c-malloc不适用于双类型数组,c,arrays,double,malloc,C,Arrays,Double,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(doub

我试图为一个双类型数组分配内存,以便与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];
    }
}
double*x_i,*y_i,*x_e,*y_e,数据[MAX_SIZE][2];
int n_i,n_e,n_数据;
...
x_i=(双*)malloc(n_i*sizeof(双));
y_i=(双*)malloc(n_i*sizeof(双));
x_e=(双*)malloc(n_e*sizeof(双));
y_e=(双*)malloc(n_e*sizeof(双));
对于(int i=0;i0){
x_e[i]=数据[i][0];
y_e[i]=数据[i][1];
}
否则{
x_i[i]=数据[i][0];
y_i[i]=数据[i][1];
}
}
n_i+n_e=n_数据

显然,
sizeof(x/y\u e/i)
在malloc是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(x_i)
with
x_i
double*
类型是指针的大小(可能是系统上的
8
),而不是分配的内存大小。无法仅从指针获取指针指向的内存块的大小

其次,没有在循环中设置的数组的“更改值”是由于没有初始化数组的这一部分而导致的。实际上,您会产生未定义的行为,很可能在访问这些值时打印“垃圾”。要克服此问题,请使用
calloc
而不是
malloc
calloc
zero初始化分配的内存块,根据IEEE标准,所有位设置为
0
的浮点值表示浮点值
0.0

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

除了
sizeof(x/y\u e/i)
实际返回
sizeof(double*)
(如其他用户所述),for循环不正确:

如果
n_i+n_e==n_data
,那么您总是会遇到这样一种情况:试图访问
x/y_e/i[i]
将使您出局。为了避免这种情况,您可以分别跟踪
x/y\u e
x/y\u 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++;
    }
}
int i_e=0,i_i=0;
对于(int i=0;i0){
x_e[i_e]=数据[i][0];
y_e[i_e]=数据[i][1];
i_e++;
}
否则{
x_i[i_i]=数据[i][0];
y_i[i_i]=数据[i][1];
i_i++;
}
}

循环结束时,您应该发现
i_e+i_i==n_data
,分配给
x_e/i
y_e/i
的值是一致的。

n_i,n_e,n_data
未初始化。至少在显示的代码中。您也不会初始化所有
x_i
x_e
。由于循环中的if条件,这些单元格中的一些保持不变。这些可能是您的“不一致”——nan值、perhapsMarcus、sizeof将只返回编译时已知的大小。只有固定数组的sizeof返回数组的“长度”。由于您在运行时进行mallocing,因此在编译时不会知道它。即使编译器可以派生它,指针的大小也会根据平台的不同而不同,即@xing已经提到过。malloc总是“起作用”。程序员没有。你应该问:我的程序出了什么问题,而不是当你改变它的值时,
xi
的大小不会改变。调用
malloc
后,您的作业只会更改
xi
的值(即
malloc
返回的值)。感谢您的帮助,朋友!我最初使用的是calloc,但在一个函数中,程序也有相同的行为,可能是因为我犯了一些错误。我很快就会尝试你的建议。再次感谢!谢谢你的建议!现在我回到家,全神贯注地读着你的答案,它看起来很明显。现在一切都正常了,我感到既愚蠢又快乐。非常感谢。太好了!很高兴我们能帮忙