2014-11-08 2 views
0

만약 내가 할 수만 있다면 주 기능의 구조 복사본을 초기화하고 다른 기능으로 전달하여이 문제를 해결할 수 있지만이 프로젝트의 기능 헤더는 변경할 수 없습니다.하나의 함수에서 생성 된 데이터 구조를 다른 함수에서 반환하거나 전달하지 않고 데이터 구조에 액세스하는 방법은 무엇입니까?

나는 이것을 사용할 수있는 권한이 주어 졌기 때문에 동적 메모리 할당을 사용하여 함수의 동작을 마지막으로 함수의 범위와 독립적으로 만드는 방법에 대해 배울 수있는 좋은 해결책이 있다는 것도 확신합니다. 그 기능.

내 구조체 :

typedef struct AmNet { // this struct can be changed as needed 
    int size; 
    User ** users; // group of users in the net 
    User *front; // the first user 
    User *back; // the last user 
} *AmNet; 

만들 수있는 기능은 다음과 같습니다 예를 들어

create_net(); 

그런 다음, 다음과 함께 단순히라는 또 다른 파일의 주요 기능에

void create_net(){ // this line cannot be changed 
} 

, -이 함수는 구조체에 액세스 할 수 있어야하고 새 사용자를 만들고 같은 구조체의 목록에 추가 할 수 있어야합니다. 사용자.

void addUser(const char *name) { 
} 

그리고 구조체의 초기화와 같은이 .c 파일 내의 다른 기능은 데이터 구조를 취하거나 반환하지만, 그들은 그것을 액세스하고 그것을 바탕으로 행동 할 수 없습니다. 마치 구조가 전역 변수처럼 취급 될 수있는 것처럼 말입니다.

어떻게 수행 할 수 있습니까?

+0

"create_net"을 여러 번 호출 하시겠습니까? 또는 고유 한 인스턴스를 만드는 데 오히려 사용됩니까? –

+0

고유 한 인스턴스를 만들면됩니다. –

+0

그냥 구조체의 인스턴스를 파일의 모든 함수 외부에 만듭니다. 그런 다음 파일의 모든 항목에 액세스 할 수 있습니다. – user3629249

답변

2

전역 변수를 선언하려면 선언을 모든 함수 외부에 배치하십시오. gNet 같은

struct AmNet gNet; 

void create_net() { 
    gNet.front = NULL; 
    ... 
} 

Global variables 널리 나쁜 관행으로 간주됩니다. 프로토 타입을 변경할 수 없다면 다른 방법은 없지만 적어도 static 선언은 파일 범위를 유지할 것입니다.

/* in AmNet.c */ 
static struct AmNet *gNet; 

void create_net() { 
    gNet = (struct AmNet *)malloc(sizeof(struct AmNet)); 
    gNet->front = NULL; 
... 
} 
+0

malloc을 사용하여 어떻게 gNet에 메모리를 동적으로 할당 할 수 있습니까? 우리가 명백한 이유로 글로벌 변수를 사용하기를 원한다고 생각하지 않았습니다. 정적 제안을 위해 upvoted. –

+0

감사합니다. 이 경우 typedef 구조체를 정의하는 데 사용되는, 그냥 gNet = (Amnet *) malloc (sizeof (Amnet)) 수도 있습니다 생각하십니까? –

+1

@Rohawk이 작동하려면'typedef'를'typedef struct AmNet {...} AmNet;'('*'없이)으로 변경하십시오. 그렇지 않으면 구조체에 대한 포인터를 typedef합니다. – ryanpattison

관련 문제