0

다른 구조체 내에서 구조체 배열에 동적 메모리를 할당하는 방법을 이해하지 못합니다. 마찬가지로, 내 문제는 ... 여기에 main을 포함하는 project.c 파일이 있는데, 용어를 추가하거나 다항식을 곱하는 등의 다항식 연산을 처리하는 또 다른 polynomial.c 파일이 있습니다.구조체 내에서 배열의 동적 메모리 할당

이 polynomials.h

typedef struct term{ 
    int coeff; 
    int expo; 
} TERM; 

typedef struct polynomial { 

int size; 
// This needs to be changed to calloc.. not sure how within a struct 
TERM terms[20]; 

} POLYNOMIAL; 
... 
... 

나는 또한 동적으로 폴리 배열에 대해 메모리를 할당 내 project.c 파일 내에이이에 대한 헤더 파일입니다.

POLYNOMIAL *polynomials = (POLYNOMIAL *)malloc(sizeof(POLYNOMIAL) * 8); 
// 8 being the max number of polynomials I wan to store 

여기서 두 가지 질문이 있습니다. 용어 배열에 동적으로 메모리를 할당해야하는시기와 방법은 무엇입니까? 내가 용어의 빈 배열에 대한 calloc 메모리를 보유하고 포인터에 포인터를 할 생각을했다. 이것은 프로그램 시작에서 다항식 할당 후에 수행됩니다 (필자는 생각합니다).

또 다른 질문입니다. 이제 메모리를 없애기 전에 프로그램이 끝나기 전에 끝내야합니다. 그리고 내가 무료로해야 할 순서는 바로 아래에 있어야합니다. 다시 말하면, 용어 배열을 다항식 배열로부터 해방시킵니다.

이 시점에서 힌트 또는 지침이 도움이 될 것입니다. 감사!

답변

1

당신은 단순히 그래서 당신이하려고하는 것은

POLYNOMIAL *polynomials = calloc(size, sizeof(POLYNOMIAL)); 

for (int i = 0; i < size; ++i) 
    polynomials[i].terms = calloc(20, sizeof(TERM)); 

같은이 직접 구조체 선언에서 그것을 할 수 없습니다

TERM *terms = calloc(20, sizeof(TERM)); 

으로 할당 할 수 있습니다 그리고 네, 당신은 것입니다 메모리를 아래쪽으로 비워야 만합니다. 먼저 모든 조건을 해제 한 다음 POLYNOMIALS 배열을 해제합니다.

+3

그는 그를 위해 숙제를하는 것으로 자격이 있습니다. 그것을 해결하지 않고 그를 위해 그것을하지 않고 그를 해결책으로 인도하는 것이 더 좋지 않을까요? –

+0

* 용어 calloc은 언제 어디에서 호출되어야합니까? – Hall9

+0

가장 중요한 점은 포인터를 사용하는 다항식이 유효한 포인터를 가리킨다는 것입니다. 그렇지 않으면 멤버를 할당 할 수 없습니다. – Jack

0

귀하의 질문은 숙제로 태그되었으므로 정확하게 말씀하지 않겠습니다.

TERM terms[20]은 리터럴 내부 배열입니다. 함수에서 그와 같은 변수를 선언했다면 그 배열 요소의 수만큼 스택에 정확히 공간을 확보 할 것입니다. 만약 당신이 구조 내부에서 그것을했다면 구조 자체 내에 공간을 남겨 둘 것입니다. 따라서 X x[n]에서 배열 구문으로 사용되는 것과 동일한 포인터 구문으로 변경하라는 요청을 받았습니다.

POLYNOMIAL * polynomials을 작성 했으므로 (a) 단일 다항식에 대한 포인터이거나 (b) 다항식 배열에 대한 포인터이고 malloc 표현식을 사용하여 초기화 할 수 있습니다.

질문에서 이미 알고있는 것을 사용한다면, 분명히 자신이 직감을 요구하는 것을 볼 수 있습니다. 필드 term을 하나 또는 여러 개의 TERM 구조체를 가리킬 수있는 방식으로 다시 작성할 수 있습니다.대한

0

는 A 보일 것입니다 귀하의 polynomial 구조체 시작 : 각 polynomial 구조체에 대한 다음

typedef struct polynomial { 
    int size; 
    TERM *terms; 
} POLYNOMIAL; 

을 당신은 :

p.terms = calloc(size, sizeof(*terms)); 

당신은 메모리는 무료 전에 terms가 가리키는 비워야합니다 그렇지 않으면 terms 회원에게 액세스 할 수 없기 때문에 polynomial 구조체가 필요합니다.