2015-02-06 2 views
-1

내 상황의 요지는 내가 구조체를 초기화하려고 할 때 양립 할 수없는 유형의 할당을 받았다는 것입니다. 나는 C에 상당히 익숙하며 이해하는 포인터는 나를 위해 상당한 도전이된다는 것을 증명한다. 그러나 나는이 오류와 비슷한 질문을하고 다른 수정을 시도했으며 지금까지 행운이 없었다. 누군가가 나를 위해 이것을 고칠 수 있다면, 당신은 내 영웅이 될 것입니다.C - 호환되지 않는 유형의 대입 - 구조체 및 문자 배열

struct Employee { 

    char* name[100]; 
    int birth_year; 
    int starting_year; 
}; 

struct Employee* make_employee(char* name, int birth_year, int starting_year); 

int main(){ 
//some main stuff code 
} 

struct Employee* make_employee(char* name, int birth_year, int starting_year){ 

struct Employee* newEmpl = (struct Employee*)malloc(sizeof(struct Employee)); 
newEmpl->name = name; 
newEmpl->birth_year = birth_year; 
newEmpl->starting_year = starting_year; 

    return newEmpl; 
} 

할당 오류는 name = name 행에 발생합니다. 나는 이유를 모른다. 내가

strcpy(&(newEmpl->name), name); 

으로 그 라인을 전환하는 경우 또한 내가 얻을 :

경고 : 나는 2 시간 동안 문제를 찾기 위해 노력했습니다

호환되지 않는 포인터 유형에서 'strcpy를'의 인수 하나를 전달 , 그리고 행운은, 내가 여기의 발사를 줄 것이라고 생각했다.

당신의 구조에서
+0

코드에서'name'은 포인터 배열입니다. 아마 당신은'char name [100]'을 원했을 것입니다. – tsnorri

답변

0

,

newEmpl->name = name;  //arrays cannot be assigned 

사용하는 대신에, 당신의 make_employee() 기능에,

char name[100];  // a character array 

그런

char* name[100]; //an array of pointers to character 

에 변경

strcpy(newEmpl->name, name); // copy the contains of name to newEmpl->name 

또는

strncpy(newEmpl->name, name, 99); // limit to 99 elements only + terminating null 

참고 :

  1. malloc()와 가족의 반환 값을 캐스팅하지 마십시오.
  2. 반환 된 포인터를 사용하기 전에 malloc() 및 패밀리가 성공했는지 확인하십시오.

    char* name; 
    

    char 포인터이다

+0

strcpy보다 훨씬 좋으므로, size 인자가 ​​100 인'char * strncpy (char * dest, const char * src, size_t n)'를 사용하여 문자열 버퍼를 오버플로하지 않도록하십시오. –

+0

@fearless_fool 고마워요.하지만 크기는 종료 null을 수용하기 위해 99 여야합니다. 업데이트 됨. :-) –

+0

흠 - 나는 그것이 99가되어야한다고 반대하지만, 나는 틀린 것으로 알려져 있습니다. strncopy에 대한 문서를 확인하고 왜 그것이 99라고 생각하는지에 대한 이유를 설명하십시오 :) –

1
char* name[100]; 

char 포인터의 배열 일 뿐이다. 여기

: 당신은 배열에 char에 대한 포인터를 할당하려고하지만 C에서 배열에 대한 포인터를 할당 할 수 없습니다

newEmpl->name = name; 

! 사실 C의 배열에는 아무 것도 지정할 수 없습니다.

프로그램에서 올바른 유형을 사용하고 있는지 확인하십시오. char name[100]; (char 배열)이 아닌 char *name[100];을 사용 하시겠습니까? 그런 다음 문자열을 복사하려면 배열에 무언가를 할당 할 수 없으므로 strcpy 또는 strncpy 연산자를 사용하고 = 연산자는 사용하지 마십시오.