我有一个复数数组,想在数组的第一位置添加一个新的复数。
我有一个结构和一个函数,它在数组的第一个位置输入一个新的复数。
我有一个包含复数的结构
struct Complex
{
float imag;
float real;
};
我还有一个函数,可以在堆上创建这样一个复数的实例
struct Complex* instanceOfComplex(float a, float b)
{
struct Complex* complex = malloc(sizeof(struct Complex));
if(complex == NULL)
{
return NULL; // out of memory
}
complex->imag = a;
complex->real = b;
return complex;
}
最后我有一个函数,应该在复数数组的第一位置放置一个新的复数
int attach(struct Complex *complexArray, struct Complex complex, int length)
{
int i;
for(i = length; length > 0; i--)
{
complexArray[i] = complexArray[i - 1];
}
complexArray[i] = complex;
length++;
return length;
}
主要功能如下
int main()
{
float a = 3.6;
float b = 6.8;
struct Complex* complex = instanceOfComplex(a, b);
printf("%f %f\n", complex->imag, complex->real);
int length = 4;
struct Complex* complexArray = malloc(sizeof(length + 1) * sizeof(struct Complex));
complexArray[0] = *instanceOfComplex(8.2, 9.3);
complexArray[1] = *instanceOfComplex(7.1, 4.6);
complexArray[2] = *instanceOfComplex(0.1, 2.7);
complexArray[3] = *instanceOfComplex(5.6, 1.9);
attach(complexArray, *complex, length);
}
因此,最后数组应该包含5个复数元素,其中新的复数位于complexArray [0]位置,其他4个元素为以下元素。
问题出在主函数中,因为所有元素都保持(8.2,9.3)。有人可以告诉我,这是怎么了?
答案 0 :(得分:2)
您正在instanceOfComplex
中为新实例分配内存,然后返回该内存(即,返回指向新分配的内存的指针)。
在main
中,您将指针取消引用,并将值分配给数组元素。
您正在失去记忆。 Eiter在main
中分配一个指向复数的指针数组,或者在instanceOfComplex
中具有一个按值返回的局部变量。
正如用户Yakov Dan在回答中所说,您错误地在main
中分配了内存,这很可能会导致您出错。
答案 1 :(得分:1)
为数组分配内存时,说1
是错误的。
相反,该行应为:
sizeof(length+1)