指向动态结构数组的指针

时间:2011-03-24 22:11:47

标签: c pointers struct

基本上我所要做的就是将某个(多项式)分配给给定索引处的动态数组,覆盖其中的任何内容。为简单起见,我只是使subtract()返回指向polynomialArray中第一个元素的指针。所以,这段代码应该复制第一个元素的内容并替换另一个元素(我知道需要深层复制,并且这是在减法中实现的)。我被Java宠坏了(你们好心人)...

当我在它被复制到的索引上打印时,那里什么也没有。 通常会打印Poly1 = 2x^3 + 4x之类的内容,但只打印Poly1 =

编译正常并运行,但不执行我需要的操作。编辑:如果该索引没有任何内容,则运行正常。如果索引处有某些内容,则会出现错误。

//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 个答案:

答案 0 :(得分:1)

我认为问题出在free(polynomialArray[index].polynomialTerm);,如果索引> 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. 如果index更大,则不会增加num_polynomial。
  2. 你不知道索引有多大,所以你可能会分配一个更大的内存,后来,如果你试图达到之前的num_polynomial和新大小之间的任何东西,你会到达未知区域,并且可能再次遇到段错误。

答案 1 :(得分:0)

我认为问题是subtract正在向动态分配的数组返回一个指针,然后insert realloc的那个数组,留下通过subtract返回的指针(作为{{1}传递给insert晃来晃去。

因此,在标记为element的行上,element指向刚刚隐式释放的(通过realloc)数组,该数组可能已被内存管理系统覆盖。在任何情况下,在释放后访问内存都会产生未定义的行为。