2014-11-29 1 views
1

C 함수의 매개 변수로 포인터를 전달하는 방법을 잘못 이해 한 것 같습니다. 과거에는 전역 변수와 모든 단일 C 파일을 속여서 사용했습니다. 별도의 C 파일을 사용하여 단일 실행 파일에 링크하는 방법을 배우려고합니다.컴파일러는 struct가 struct라고 정의했을 때 매개 변수가 struct **라고 말합니다. *

룸은 typedeffed 구조체입니다.

나는 functions.h라는 보호 헤더 파일에서 함수를 프로토 타입이 있습니다

void init_rooms(Room *rooms[], Room *current_room); 
/* (pointer to the room struct array, pointer to current room) */ 

내가 다음의 main.c와 functions.c 모두 해당 헤더를 포함했다.

functions.c의 함수 정의는 다음과 같습니다

void init_rooms(Room *rooms[], Room *current_room){ 
current_room = rooms[0]; 
...} 

나는이 같은 main.c에있는 함수를 호출 :

Room * current_room; /* pointer to current player location */ 
Room * rooms = malloc(sizeof(struct room)*NUM_ROOMS); /* allocate memory for rooms */ 
init_rooms(rooms, current_room); 

그리고이 오류가 얻을 :

main.c|11|error: incompatible pointer types passing 'Room *' (aka 'struct room *') to parameter of type 'Room **' (aka 'struct room **'); take the address with & [-Werror,-Wincompatible-pointer-types]| 

자, 여기에 포인터에 대한 포인터를 정의하지 않았고, 모든 타입을 가지고있는 것처럼 보입니다. 나를. 컴파일러가 매개 변수가 ** 형식이라고 말하는 이유는 무엇입니까?

차이점이 있다면 Linux에서 Clang을 사용하고 있습니다.

편집 : 나는 또한 컴파일러가 제안한대로 포인터 역 참조를 시도했지만 다른 오류가 발생했습니다.

+2

그 소리 오류가 나에게 정말 명확하다. – DRC

+0

나에게 분명했다면, 나는 너를 괴롭히지 않았을거야! – Andomonir

+1

'Room * rooms []':'rooms'은'Room' 포인터의 배열입니다. 'Room * rooms'은'Room'에 대한 포인터입니다. – BLUEPIXY

답변

3

init_rooms()로 변경 할 수 있습니다 Room **room

과 동일합니다.

void init_rooms(Room *rooms, Room *current_room) 
{ 
    current_room = rooms; 

: 그것은 당신이 그 기능을 시작하려는 좋은 기회가, 코드의 나머지 부분을 보지 않고

void init_rooms(Room **rooms, Room *current_room); 

본질적으로 동등한 인 배열 중 (Room *rooms[])를 취 그러나 current_room내부에만의 기능으로 변경된다는 점에 유의하십시오.

void init_rooms(Room *rooms, Room **current_room) 
{ 
    *current_room = rooms; 

과로 전화 : 당신은 그 값이 외부 을 변경하려는 경우,이 작업을 수행

init_rooms(rooms, &current_room); 
+0

위대한 답변을 주셔서 감사합니다. – Andomonir

0

문제는 함수 인수에있다 : Room *rooms[] C에서 , 배열은 단지 포인터 - Room *room[]을 정의, 당신의 경우 :

... 그리고 포인터의 배열, 그냥 포인터에 대한 포인터입니다 당신은 Room *을지지 않습니다 Room *rooms

+2

배열은 포인터가 아닙니다! – alk

+0

C에서 "C strings"은 char 배열이있는 포인터를 사용합니다. –

관련 문제