2010-02-01 5 views
6

함수 내에서 구조체를 만들 필요가 있습니다 (동적으로 malloc) 그럼 내 주체로 보내고 거기에서 사용할 수 있어야합니다. 나는 그것을 만드는 데 아무런 문제가 없다. 나는 단지 내 메인으로 보내는 데 도움이 필요하며, 일단 내가 그것을 얻으면 어떻게 접근해야하는지 확신 할 수 없다.구조체에서 함수 반환 (C)

struct retValue * fn() { 
struct retValue 
{ 
    int number; 
}; 

struct retValue* st = malloc(sizeof(*st)); 


return(???); 
} 

내가 지금까지 가지고있는 코드입니다.

도움 주셔서 감사합니다. 뭔가 명확히 해줄 필요가 있으면 알려주세요.

편집 :

확인을 일부 설명이 필요하다.

내가 달성하려고하는 것은 기능을 통해 구조를 내 메인으로 전달하는 기능입니다. 함수 내에서 변수를 선언하고 값을 할당해야합니다. 그런 다음 메인에서 구조의 각 변수를 화면에 인쇄해야합니다. 전역 변수를 사용할 수 없습니다 (따라서 전역 구조가 없다는 가정하에).

그 점을 명확히 밝히기 바랍니다.

편집 2 : 나는 내 문제를 알아 냈어요

. 관심이있는 사람들을 위해 먼저 필자의 기능 외에서 구조 프로토 타입을 작성해야했습니다. 그렇다면 나는 성을 통과하고 올바르게 접근 할 수 있습니다. 모두에게 감사하고 가난한 말씨를 유감스럽게 생각합니다.

+0

전역 변수와 전역 구조가 다릅니다. 구조체를 전역으로 만들면 변수가 아닌 유형 만 정의하게됩니다. 구조체를 전역으로 만들지 않으면, 다른 함수는이 새로운 * type *에 대해 아무 것도 알지 못할 것이고 prg는 컴파일되지 않을 것입니다. – codaddict

답변

8
// make the structure def global so that main() and fun() know about it. 
struct retValue { 
int number; 
};  

// function fn returns a pointer to the structure retValue 
struct retValue * fn() {  

struct retValue* st = malloc(sizeof(*st)); 

// return the pointer to the newly allocated structure. 
return(st); 
} 

int main() { 

// call fn() to create a new structure dynamically. 
struct retValue *st = fn(); 
} 
0

은 : return st;

+0

'호환되지 않는 포인터 유형에서 반환'이 발생합니다. – Blackbinary

4

당신은이 질문에 대한 답변의 수백을 얻을 것이다. :)

  1. 포인터를 직접 반환 할 수 있습니다. 예 : return st, 그러면 주 함수가 st->number에서와 같이 구조체의 멤버에 액세스 할 수 있습니다. 완료되면 주 free 포인터를 확인하십시오.

  2. 이것은 반드시 좋은 디자인 패턴은 아닙니다. 피 호출자 (fn)가 메모리를 할당하고 있지만 호출자 (주)가 여파를 처리해야합니다. 또한 메모리를 (malloc을 사용하거나 직접 스택을 사용하여) 할당하고 fn이 사용할 포인터를 전달하는 방식으로이를 구조화 할 수 있습니다. 그런 다음 malloc/free가 같은 위치에서 발생합니다. 그렇지 않으면 fn 함수의 이름을 allocateMyStructure과 같이 명확하게 지정해야하므로 반환을 해제해야한다는 것이 확실합니다.

P. 함수 내부에서 구조체를 정의하는 규칙에 대해서는 잘 모르겠지만 여기서는 그렇게해서는 안됩니다. main과 fn 함수 위에 struct retValue를 선언하면 선언 된 유형을 "볼 수"있습니다.

+0

함수 이름이 명확하지 않은 한 함수에서 메모리를 할당하는 것이 문제가 아닌 것 같습니다 (CreateNewFoo() 또는 이와 비슷한 것). 그렇지 않으면 동의합니다. –

0

구조체를 공통 헤더 파일에 선언하고 소스 파일에 포함시킨 다음 현재 함수에서 st를 반환하십시오. 그게 효과가있다. 나는 구조가 함수에 지역이기 때문에 ... 지적하고 싶습니다

0
struct retValue { int number; }; 

int main(...) { 
    struct retValue *myval; 

    myval = fn(); 
} 

struct retValue *fn() { 
    struct retValue* st = malloc(sizeof(*st)); 

    return st; 
} 
1

것은, 정확히 일치하는 글로벌 구조는 어떻게 main()을 것, 그렇지 않으면 당신은 곤경에 실행할 수있다 그 구조에 무엇이 있는지 압니까? 당신은 명확히 할 수 있습니까?

편집 : 내 대답은 내가 생각한 것을 확인한 것 같습니다.

 
struct retValue 
{ 
    int number; 
}; 

int main(int argc, char **argv){ 
    struct retValue *ptr; 
    ptr = fn(); 
    /* do what you have to do... */ 
    .... 
    return 0; 
} 

struct retValue * fn() { 
    struct retValue* st = malloc(sizeof *st); 

    /* do you work on the structure */ 
    st->number = 5; 

    return st; 
} 

덧붙여 누군가 오늘 this을 (를) 게시했습니다.

호프가 도움이 되었으면 안녕하세요, 탐.