C программирование: структура комплексных чисел - PullRequest
0 голосов
/ 02 января 2019

У меня есть массив комплексных чисел, и я хочу добавить новое комплексное число в самом первом положении массива.

У меня есть структура и функция, которая вводит новое комплексное число в первой позиции массива.

У меня есть структура, которая содержит комплексные числа

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 голосов
/ 02 января 2019

Вы выделяете память для нового экземпляра в instanceOfComplex и возвращаете его (то есть вы возвращаете указатель на вновь выделенную память).

В вашем main вы разыменовываете указатель и назначаетезначения элемента массива.

Вы теряете память.Eiter выделяет в main массив указателей на комплекс или имеет локальную переменную в instanceOfComplex, которую вы возвращаете по значению.

Как говорит пользователь Яков Дан в своем ответе, вы ошибочно выделяете память в main, что, вероятно, вызывает вашу ошибку.

0 голосов
/ 02 января 2019

Когда вы выделяете память для вашего массива, неправильно говорить sizeof(length+1).

Вместо этого эта строка должна быть:

struct Complex* complexArray = malloc((length + 1) * sizeof(struct Complex));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...