Присвоение указателя динамическому массиву структур - PullRequest
1 голос
/ 25 марта 2011

По сути, все, что я пытаюсь сделать, это назначить что-то (полином) динамическому массиву с заданным индексом, перезаписывая все, что там есть. Для простоты я только что заставил subtract () возвращать указатель на первый элемент в polynomialArray. Итак, этот код должен копировать содержимое первого элемента и заменять другой элемент (я знаю, что необходима глубокая копия, и это реализовано в вычитании). Я был избалован Java (и вы, добрые люди) ...

Когда я иду печатать его по индексу, в который он копируется, там ничего нет. Обычно печатается что-то вроде Poly1 = 2x^3 + 4x, но вместо этого печатается Poly1 =.

Компилируется нормально и запускается, но не делает то, что мне нужно. РЕДАКТИРОВАТЬ: работает нормально, если не было ничего по этому индексу. Если что-то есть в индексе, seg error.

//Portion of main from another file
  Polynomial* subtracted = subtract(op1_index, op2_index);
  insert(subtracted, diff_index);
  printPolynomial(diff_index);

//Methods in question (utils file)
  void insert(Polynomial* element, int index) {
    if(index > num_polynomial) {
      polynomialArray = (Polynomial*)realloc(polynomialArray, (index + 1) * sizeof(Polynomial));
    }
    free(polynomialArray[index].polynomialTerm);
    polynomialArray[index] = *element;  // Problem here?
  }

  Polynomial* subtract(int op1_index, int op2_index) {
    return &polynomialArray[0];
  }

//Typedefs accessible in main and utils file 
  typedef struct term { 
    int exponent; 
    int coefficient; 
  } Term;  

  typedef struct polynomial { 
    Term *polynomialTerm; 
  } Polynomial; 



//variables accessible in utils file
      static Polynomial *polynomialArray;
      int num_polynomial; // counter to keep track of the number of polynomials 

Ответы [ 2 ]

1 голос
/ 25 марта 2011

Я думаю, что проблема здесь free(polynomialArray[index].polynomialTerm);, если index> num_polynomial, то значение polynomialArray[index].polynomialTerm является мусором.Вам не нужно освобождать это.вместо этого вы должны написать что-то вроде этого:

void insert(Polynomial* element, int index) {
    if(index >= num_polynomial) {                     /*  probably should be >= depends on your implementation   */
      polynomialArray = (Polynomial*)realloc(polynomialArray, (index + 1) * sizeof(Polynomial));
    }
    else
    {
        free(polynomialArray[index].polynomialTerm);
    }
    polynomialArray[index] = *element; 
  }

также, это немного рискованно.по двум основным причинам:

  1. вы не увеличиваете num_polynomial, если индекс больше.
  2. вы не знаете, насколько больше индекс, поэтому вы можете выделить гораздо большую памятьи позже, если вы попытаетесь достичь чего-либо между предыдущим num_polynomial и новым размером, вы попадете в неизвестную область и, вероятно, снова получите segfault.
0 голосов
/ 25 марта 2011

Я думаю, что проблема в том, что subtract возвращает указатель на ваш динамически размещенный массив, но затем insert realloc в этом массиве, оставляя указатель, возвращенный вычитанием (переданным в вставку как element), зависшим.

Таким образом, в строке, которую вы пометили Problem here?, элемент указывает на только что неявно освобожденный (от realloc) массив, который вполне может быть перезаписан системой управления памятью. В любом случае доступ к памяти после ее освобождения дает неопределенное поведение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...