2014-06-19 2 views
0

현재 C 프로그램을 작성 중입니다. 함수에서 구조체와 포인터를 사용하고 있습니다. 모든 것이 Windows에서 잘 작동하지만 Linux debian에서는 작동하지 않습니다. Linux 데비안에서 프로그램을 컴파일하려고 할 때 오류가 있습니다.C 코드가 Linux에서 컴파일되지 않았습니다. 데비안

typedef struct human 
{ 
char name[100],code[100]; 
}human; 

void hello(char* name, char* code) 
{} 

int main() 
{ 
human human; 
hello(&human.name,&human.code); 
return 0; 
} 

이 난을 main.c 파일을 컴파일 할 때 사람들은 경고를 얻을 :

Warning passing argument 1 of Human from incompatible pointer type 
Note: expected char *a but argument is type of char(*)[100] 
Warning passing argument 2 of Human from incompatible pointer type 
Note: expected char *a but argument is type of char(*)[100] 

답변

4
typedef struct human 
{ 
    char name[100], code[100]; 
} human; 

void hello(char* name, char* code) 
{ 
} 

int main() 
{ 
    human human; 
    hello(human.name, human.code); 
    return 0; 
} 

는 앰퍼샌드 (&)을 namecode 배열을 전달 제거합니다. char 배열은 char*과 호환됩니다. human.name이라고 말하면 실제로 배열의 첫 번째 요소의 주소를 참조하는 것입니다.

또한 hello이 반환하지 않는 경우 반환 유형은 void이어야합니다. 반환 유형을 생략하면 int으로 간주되지만 이는 매우 오래된 방법이며 권장하지 않습니다.

GCC로 컴파일 할 때 항상 이상을 사용하십시오. -Wall 이상이어야합니다. 우수 사례 (나중에 익숙해 져야 함)는 다음과 같습니다.

gcc -Wall -Wextra -Werror foo.c 

마지막으로 적절한 들여 쓰기를 사용하십시오.

0

기본적으로 오류는 배열의 주소를 char 배열이 필요한 함수에 전달한다는 의미입니다.

human.name의 종류는 함수에 human.name로 전달 (100)의 크기, 즉 char [100]char 어레이, 그것은 char* 입력 갖는다 어레이의베이스 어드레스로 붕괴. 그래서, 모든 것이 잘되고, 당신은 실제로이 행동 만 원했습니다.

이제, 사용자가 입력 char (*) [100] (크기 100 char 어레이에 대한 포인터)이다 함수에 human.name 배열의 주소를 전달하려고하는, 따라서 타입 불일치가 발생하는 것을 의미한다 &human.name 합격했습니다.

관련 문제