2009-05-03 2 views
0

누군가가이 C 코드를 빠르게 살펴보고 왜 컴파일러 오류가 발생하는지 확인할 수 있습니까? 이는 일정 구조에 세부 정보를 입력하는 기능이며 일정 하나의 노드, 즉 일정에 하나의 '이벤트'를 만들어야합니다.C 캘린더 구조

struct event enter_key(void) 
{ 
     int day,month,year,starttime,endtime,length; 
     char* descp; 
    struct event* n; 

     printf("Enter Day:\n"); 
     scanf("%d", &day); 
     printf("Enter Month:\n"); 
     scanf("%d", &month); 
     printf("Enter Year: \n"); 
     scanf("%d", &year); 
     printf("Enter starttime:\n"); scanf("%d", &starttime); 
     printf("Enter endtime:\n"); 
     scanf("%d", &endtime); 
     printf("Enter Description: \n"); 
     scanf("%s", &descp); 


     n=mkevent(day, month, year, starttime, endtime, &descp); 

때 나는이 메시지를받은 컴파일하려고 :

newpro.c : 115 : 경고 : 호환되지 않는 포인터 유형에서 'mkevent'의 인수 (6)을 통과

수를 아무도 내가 포인터를 잘못 선언했는지 또는 'descp'포인터를위한 공간을 할당해야하는지, 아니면 잘못된 방식으로 구조체에 노드를 만들려고했는지 말해 줄 사람이 있습니까?

고마워, C 초보자.

+0

실제 코드를 복사하여 붙여 넣으십시오 - 다시 입력하지 마십시오. 또한 오류 메시지가 발생한 코드의 주석으로 표시하십시오. –

답변

2

포인터는 사용자가 scanf 호출에서 입력 한 값만큼 큰 버퍼를 가리켜 야합니다.

%s  Matches a sequence of non-white-space characters; 
      the next pointer must be a pointer to char, and the 
      array must be large enough to accept all the 
      sequence and the terminating NUL character. The 
      input string stops at white space or at the maximum 
      field width, whichever occurs first. 

그래서 당신이 가능한 사용자뿐만 아니라 (버퍼 오버 플로우가 발생할 수와 문자열을 읽는 기술 중 하나를 사용해야합니다 실제 코드에서

char descp[ MAX_DESCRIPT ]; 

scanf("%s", descp); 

비록 같은 수 공백을 포함하는 설명 입력 요구 사항).

잘못된 방식으로 노드를 만들려고 했습니까?

내가 mkevent의 서명을 모르겠지만, 나는 그것이 오히려 문자열에 대한 포인터에 대한 포인터보다, 설명과 같은 문자열 버퍼 (const char*) 포인터를 취할 기대 (descp 전달 &descp 대신).

0

mkevent에는 다른 유형의 매개 변수 (& descp 위치)가 필요하다는 메시지가 표시됩니다.

mkevent()가 필요로하는 것을 다시 확인해야합니다. 그것은 char ** 아니에요.

어쩌면 당신은 & descp를 mkevent 줄에서 descp로 변경해야합니다.

1

descp는 'char to pointer'(char *) 유형입니다. 문제가되는 행에서 포인터 자체의 주소 (char **)를 전달합니다. 인수 앞에 '&'을 제거하십시오.

아, 특히 프로덕션 코드에서 scanf()를 사용하지 마십시오. 특히 문자열을 읽지 마십시오. 바운드 검사를하지 않기 때문에 버퍼 오버 플로우가 발생할 가능성이 높습니다.

0

mkevent 선언을 표시하지 않지만 주소가 아닌 desc을 전달하려고합니다.

n=mkevent(day, month, year, starttime, endtime, &descp); 

당신은 아마 원하는 :

n=mkevent(day, month, year, starttime, endtime, descp); 
0

우리에게 mkevent (의 선언을주기) 도움이 될 것입니다,하지만 당신은 당신이 descp을 통과해야한다 & descp을 통과하고 있기 때문에 그 가능성이 더있어, 당신은 .