2011-03-24 77 views
1

基本上我所要做的就是將某些(多項式)指定給給定索引處的動態數組,並覆蓋所有內容。爲了簡單起見,我只是使subtract()返回一個指向多項式數組中第一個元素的指針。所以,這段代碼應該複製第一個元素的內容並替換另一個元素(我知道深度複製是必要的,而且是在減法中實現的)。我已經被Java寵壞了(和你友善的人)...指向動態數組結構的指針

當我去打印它被複制到索引時,沒有什麼。 通常像Poly1 = 2x^3 + 4x會打印,但它只是打印Poly1 =

編譯正常並運行,但沒有做到我所需要的。編輯:運行良好,如果沒有任何在該指數。如果在索引處有東西,seg錯誤。

//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 
+0

您可以停止在您的問題中添加「編程語言」標籤。這不是必需的。 – 2011-03-24 22:16:47

+0

你能顯示你的打印功能嗎? – MByD 2011-03-24 22:17:55

回答

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. 如果索引較大,則不會增加num_polynomial。
  2. 你不知道指數是多大,所以你可能會分配一個更大的內存,並且如果你試圖達到以前的num_polynomial和新的大小之間的任何東西,你會到達未知區域,並且可能會出現段錯誤再次。
+0

感謝您的回覆,但我仍然有相同的問題:/。我可以發佈我的打印功能,但我幾乎可以確定問題在於我嘗試插入元素的方式。 – Cory 2011-03-24 22:48:09

+0

@Cory - 查看我添加到代碼中的2條評論 – MByD 2011-03-24 22:54:30

+0

仍然沒有變化。對我來說可能是我能夠有效使用GDB的好時機...... – Cory 2011-03-24 23:10:24

0

我認爲這個問題是subtract返回一個指針到您的動態分配的數組,但隨後insert realloc的是數組,留下由減法返回的指針(傳遞到插入的element)晃來晃去。

因此,在標記爲Problem here?的行處,元素指向剛被隱式釋放(通過realloc)的數組,這可能已被內存管理系統覆蓋。在任何情況下,在釋放後訪問內存都會導致未定義的行爲。