C程序设计:复数结构

时间:2019-01-02 13:53:22

标签: c

我有一个复数数组,想在数组的第一位置添加一个新的复数。

我有一个结构和一个函数,它在数组的第一个位置输入一个新的复数。

我有一个包含复数的结构

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)。有人可以告诉我,这是怎么了?

2 个答案:

答案 0 :(得分:2)

您正在instanceOfComplex中为新实例分配内存,然后返回该内存(即,返回指向新分配的内存的指针)。

main中,您将指针取消引用,并将值分配给数组元素。

您正在失去记忆。 Eiter在main中分配一个指向复数的指针数组,或者在instanceOfComplex中具有一个按值返回的局部变量。

正如用户Yakov Dan在回答中所说,您错误地在main中分配了内存,这很可能会导致您出错。

答案 1 :(得分:1)

为数组分配内存时,说1是错误的。

相反,该行应为:

sizeof(length+1)