2011-02-08 3 views
1

구조체를 만들고 새로운 구조체 자체를 반환하는 함수가 있습니다. 구조체에는 숫자 배열과 숫자가 몇 개 있는지 나타내는 정수가 들어 있습니다 (이 배열과 같습니다). 그래서 임시 구조체를 만든 후 반환하는 makeStruct가 있습니다. main에서이 함수를 호출하여 myNumbers 구조체에 할당합니다. 이것은 함수에서 구조체의 인스턴스를 만들고 myNumbers에 복사 한 다음 삭제 한 것입니다. 내 가정이 맞습니까?C : 더 이상 포인터가 없을 때 구조체에 메모리를 확보하는 방법은 무엇입니까?

올바르게 컴파일 된 것처럼 보이지만 내 구조를 가리키는 포인터가 없으므로 할당 된 메모리를 확보 할 수있는 방법이 없습니다. 어떻게 메모리를 비울 수 있습니까?

#include <stdlib.h> 
#include <stdio.h> 

typedef struct{ 
    int* numbers; /*array of numbers*/ 
    int crowd; /*crowd of numbers*/ 
} magicNums; 

magicNums makeStruct(int crowd){ 
    magicNums tempStruct, *struct_ptr=&tempStruct; /*my temp struct and its pointer*/ 
    struct_ptr=(magicNums*)malloc(sizeof(magicNums)); /*allocating memory for struct*/ 
    tempStruct.numbers=(int*)malloc(sizeof(int)*crowd); /*allocating memory for struct's numbers*/ 
    return tempStruct; 
} 

int main() { 
    magicNums myNumbers; 
    myNumbers=makeStruct(10); 
    /*magicNums *myNumbers_ptr=&myNumbers; This won't work    */ 
    /*free(myNumbers_ptr);     This won't work    */ 
    /*free(&myNumbers);      This won't work    */ 
    return 0; 
} 
+4

달콤하고 거룩한 ...이 코드에는 _ 많은 사항이 있습니다. – Chowlett

+0

그 의견이 내 마음을 웃게했다. 내 코드가 얼마나 무서운지를 자랑스럽게 생각합니다! – Pithikos

답변

0

어떻게 더 이상에 대한 포인터를 가지고하지 않을 때 구조체에 메모리를 해제하는?

행운을 빌어 요! 그것이 어디 있는지 모르는 경우, 어떻게 그것을 풀어주기를 희망 할 수 있습니까? 해결책 : 당신이 그것을 어디에 두 었는지 기억하십시오!

2

맞습니다. 올바른 포인터가 없으므로 메모리를 확보 할 수 없습니다. 메모리 누수가 성공적으로 생성되었습니다.

값으로 구조체가 아닌 해당 함수에서 구조체 포인터를 반환해야합니다.

왜 처음에는 malloc()을 사용하고 있습니까?

+0

makeStruct는 구조체 포인터를 반환 할 필요가 없으며 값으로 구조체를 반환 할 수 있습니다. 그리고 구조체 포인터를 반환하려고한다면 malloc을 사용하는 이유를 묻는 것이 의미가 없습니다. 구조체 포인터를 반환하는 것은 malloc을 사용한다는 것을 의미합니다. 구조체 값을 반환하는 것은 malloc을 사용하지 않음을 의미합니다 (numbers 배열 제외). –

+0

함수는 매개 변수 중 하나 또는 파일 범위 변수 등에 대한 포인터를 반환 할 수 있으므로 malloc은 포인터를 반환 할 필요가있는 유일한 경우가 아닙니다. 그것과 관계없이, 값에 따라 구조체를 전달하는 것은 항상 프로그래밍에서 나쁜 습관입니다. – Lundin

0

내가 알 수있는 한, 처음에는 malloc이 필요하지 않습니다. makeStruct. 에서 그리고 나중에

당신의 int main(void) (!) 당신이

free(myNumbers.numbers); 
1

대신 포인터를 반환 시도 할 수 있습니다.

magicNums* makeStruct(int crowd){ 
    magicNums *tempStruct = (magicNums*)malloc(sizeof(magicNums)); /*allocating memory for struct*/ 

    tempStruct->numbers=(int*)malloc(sizeof(int)*crowd); /*allocating memory for struct's numbers*/ 
    return tempStruct; 
} 

int main() { 
    magicNums *myNumbers; 
    myNumbers = makeStruct(10); 

    free(myNumbers->numbers); 
    free(myNumbers); 
    return 0; 
} 
+0

+1 그게 훨씬 좋다 :) – jv42

+1

tempStruct-> crowd를 설정하는 것을 잊지 마라. – Ferruccio

0

구조의 복사본을 주 프로그램으로 반환하는 동안 함수 자체에서 정리를 수행 할 수 있습니다. 그런 다음 해당 복사본에 대한 참조를 가지며 메모리를 회수하기 위해 사용 후이를 해제 할 수 있습니다.

편집 : 당신은 많은 문제가 여기에있다

1

: 원하는 정확히 될 수있는, 마틴의 대답을 참조하십시오. 하나, 질문에 대답 - 당신은 할 수 없다. 그러나 그 문제는 여기에 정말 아니다 :

난 당신이 대신한다고 생각하는거야 :

magicNums* makeStruct(int crowd){ 
    magicNums *struct_ptr = 
     (magicNums*)malloc(sizeof(magicNums)); /*allocating memory for struct*/ 
    struct_ptr->crowd = crowd; 
    struct_ptr->numbers=(int*)malloc(sizeof(int)*crowd); /*allocating memory for struct's numbers*/ 
    return struct_ptr; 
} 

당신은 할당 할 필요가 없습니다

int main() { 
    magicNums *myNumbers; 
    myNumbers = makeStruct(10); 

    free (myNumbers->numbers);   
    free (myNumbers); 

    return 0; 
} 
1

것 다음 주 struct 자체에 대한 메모리는 다음과 같아야합니다.

magicNums makeStruct(int crowd) { 
    magicNums tempStruct; 
    tempStruct.numbers = (int *) malloc(sizeof(int) * crowd); 
    tempStruct.crowd = crowd; 
    return tempStruct; 
} 

tempStruct가 생성되었지만 함수가 반환 될 때 스택에서 자동으로 해제 된 함수는 tempStruct의 복사본을 만들어 반환합니다.

당신은 다음과 같이 사용할 수 있습니다 : 귀하의 질문에 대답 할 때, "어떻게 더 이상에 대한 포인터를 가지고 있지 때 구조체에 메모리를 무료로?"

int main() { 
    magicNums myNumbers; 
    myNumbers = makeStruct(10); 
    free(myNumbers.numbers); 
} 
4

.

수 없습니다. 코드에서 메모리가 누수됩니다.

말도 안돼 코드에서 그러나 많은 오류가있다

magicNums tempStruct, *struct_ptr=&tempStruct; 
struct_ptr=(magicNums*)malloc(sizeof(magicNums)); 

위의 두 줄 첫 세트 struct_ptr = tempStruct; , 나중에 포인터를 malloc의 반환 값으로 바꿉니다. 2 줄의 결과는 정확히 다음과 같습니다.

magicNums tempStruct; 
magicNums *struct_ptr; 
struct_ptr=(magicNums*)malloc(sizeof(magicNums)); 

그 결과로 어떤 일이 벌어지고 있는지 명확하게 알 수 있습니다.

return tempStruct;

여기서 tempStruct를 반환하면 struct_ptr에 대한 포인터가 없어져서 해제 할 수 없기 때문에 메모리가 누출됩니다.

당신은 tempStruct.numbers에 대한 포인터를 잃어 버리지 않았습니다. 당신이 할 수없는,

magicNums myNumbers; 
myNumbers=makeStruct(10); 
free(myNumbers.numbers); 

magicNums 포인터하지 않고 그것을 해제 할 필요가 없습니다 : 당신은 당신의 주에서 그를 확보 할 수 있습니다. 구조체를 값으로 반환하고 있으므로 괜찮습니다. 동적 메모리가 없습니다.

+0

구조체가 메모리 할당을 필요로하지 않는다는 것을 완전히 잊었다. 내 운동을 끝내기 위해 스트레스를 너무 많이 받았다고 생각합니다. 고마워요 !! – Pithikos

+0

흠 한가지 의문이 떠올랐다. 구조체가 포인터 내부에 포인터를 가지고 있다면 실제로 배열이 두 배가된다. makeStruct() 외부에서 두 포인터를 모두 자유롭게 할 수 있을까? – Pithikos

0

여기에 자신이 생각하는 것에 대한 설명과 일치하는 코드가 있습니다. 그것이 당신이하고 싶은 것이 든, 나는 모른다.

#include <stdlib.h> 
#include <stdio.h> 

typedef struct{ 
    int* numbers; /*array of numbers*/ 
    int crowd; /*crowd of numbers*/ 
} magicNums; 

magicNums makeStruct(int crowd){ 
    magicNums tempStruct; 
    tempStruct.crowd = crowd; 
    tempStruct.numbers = malloc(sizeof(*tempStruct.numbers)*crowd); 
    return tempStruct; 
} 

int main(void) { 
    magicNums myNumbers = makeStruct(10); 
    free(myNumbers.numbers); 
    return 0; 
} 
+0

나는 Ferrucio가 1 시간 전에 거의 같은 것을 올린 것을 본다. –

관련 문제