2011-03-24 5 views
1

기본적으로 내가하려는 것은 주어진 인덱스에서 동적 배열에 무언가 (다항식)를 할당하고 거기에 무엇이든 덮어 쓰는 것입니다. 간단히하기 위해 polynomialArray의 첫 번째 요소에 대한 포인터를 subtract()로 반환했습니다. 따라서이 코드는 첫 번째 요소의 내용을 복사하고 다른 요소를 대체해야합니다 (딥 복사가 필요하며 빼기로 ​​구현 됨). 나는 자바에 버릇이있다. (그리고 너는 친절한 사람들이다.) ...구조체의 동적 배열에 대한 포인터 할당

복사 된 색인에 인쇄하려고하면 아무 것도 없다. 보통 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 
+0

'programming-languages' 태그를 질문에 추가하는 것을 멈출 수 있습니다. 그건 꼭 필요 하진 않아. –

+0

인쇄 기능을 보여줄 수 있습니까? – MByD

답변

1

나는 색인> num_polynomial, 여기에 polynomialArray[index].polynomialTerm 값이 쓰레기 인 경우 문제가 여기 free(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

답장을 보내 주셔서 감사합니다.하지만 여전히 동일한 문제가 있습니다. /. 내 인쇄 기능을 게시 할 수 있지만 요소를 삽입하는 방식으로 문제가 있음을 거의 확신합니다. – Cory

+0

@Cory - 코드에 추가 한 2 개의 설명을 참조하십시오. – MByD

+0

변경 사항 없음. 아마도 GDB를 효과적으로 사용할 수있는 좋은 시간이 될 것입니다 ... – Cory

0

나는 문제가 subtract이 동적으로 할당 된 배열에 대한 포인터를 반환,하지만 insert realloc을가 매달려 (element로 삽입에 전달) 빼기에 의해 반환 된 포인터를두고, 그 배열 있다고 생각합니다.

그래서 Problem here?이라고 표시된 행에서 요소는 암묵적으로 해제 된 (realloc에 ​​의해) 배열을 가리키고 있습니다.이 배열은 메모리 관리 시스템에서 덮어 쓸 수 있습니다. 어쨌든 메모리가 해제 된 후 메모리에 액세스하면 정의되지 않은 동작이 발생합니다.

관련 문제