2016-10-15 2 views
0

내가 잘못하고있는 것을 이해하지 못한다. 외부에서 그것을 사용하는 함수 내부에서 구조체 포인터를 전달하고 싶습니다. (전체 구조체를 전달할 수 있지만 사용자 포인터를 제대로 배우고 싶습니다.) 불완전한 형식의 포인터를 역 참조합니다. Return structure pointer

는 기능입니다 :

struct tm* GetActualTime() 
{ 
//VAR DECLARE 
time_t rawtime; 
struct tm *timeinfo=malloc(sizeof(struct tm)); 

time (&rawtime); 
timeinfo = localtime (&rawtime); 
return timeinfo; 
} 

그리고 이것은 내가 메인에서 호출하는 방법입니다

dereferencing pointer to incomplete type 

내가 이미 찾았 :

int main(void){ 
struct tm *real_time; 

real_time=GetActualTime(); 
printf("%d:%d%d",real_time->tm_hour,real_time->tm_min,real_time->tm_sec); 
} 

나는 오류 오류 및 나는 거기에 더 많은 스레드가 있지만 그것은 단지 같은 문제를 참조하십시오 : 나쁜 구조체 선언 (마녀 난 probl 생각하지 마라. 그들을 당신이 시간 관련 기능에 대한 malloc에와 time.h에 대한 stdlib.htime.h 파일, stdlib.h을 포함 할 필요가 a를 time.h lib 디렉토리에서 구조체) 또는 (대신

+2

:

#ifndef GETACTUALTIME_H #define GETACTUALTIME_H #include <time.h> // struct tm struct tm *GetActualTime(void); #endif // GETACTUALTIME_H 

을 지금 코드 데이터 회원. –

+0

이미 다른 파일에서 필자는 prototypes.h (여기서 필자는 함수 원형을 가지고 있습니다)와 myf.h를 모든 libs라고 부릅니다. 나는 기능 –

+0

게시 된 코드가 이러한 문없는 내부 시간을 인쇄 할 수 있기 때문에 나는 libs와 문제가없는'사용법 #include 사용법 #include 사용법 #include '모든 파일 헤더 파일에서 일부 항목을 사용해야합니다 그 헤더 파일에 대해'# include' 문을 가지고 있습니다. – user3629249

답변

3

) 정말이에요 나쁜 전화이기 때문에. 이 포함 프로그램이 성공적으로 실행되었습니다. 나는 점검했고 적절한 결과를 얻었다.

+0

코드에 다른 문제가 있습니다. 예를 들어, 메모리를 누수하고 라이브러리 함수가 다시 호출 될 때 재사용 (변경) 될 표준 라이브러리의 시간 함수가 제공하는 메모리에 대한 포인터를 리턴합니다. –

+0

내가 printf를 var timeinfo-> tmr_hour 등으로 함수 내에서 호출하면 원하는 결과를 얻을 수 있습니다. 내가 처리 할 수없는 것은 포인터를 반환하고 함수 내에서 사용하는 것입니다. –

+0

어떻게 그 문제를 해결할 수 있습니까? 나는 (real_time) 무료로해야하지만 어떻게 다시 함수를 호출하여 메모리 누수를 중지 할 수 알아? –

0

괜찮아요. 다른 .c 파일에서 lib를 호출하고 있지만 주에서 사용합니다. 그러나 lib 오류가 발생하지 않았기 때문에 나는 항상 내 코드가 잘못되어 뭔가를 놓쳤다 고 생각했습니다. 포인터에 관한.

시간을 낭비하고 문제를 해결해 주셔서 감사합니다. 모두에게 최고의 조언입니다.

+0

이 대답은 정확하지 않습니다. 제거하는 것이 좋습니다 – user3629249

0

다음 코드는 정확한 시간을 출력합니다.

공지 사항 localtime()의 데이터가 할당 된 메모리

공지 기능의 사용에 복사 printf()

주의에 대한 호출에서 형식 문자열에 대한 수정 : memcpy()보다는 strncpy() 일부 바이트 때문에 struct tm은 0x00이되어 strncopy() 함수가 모든 데이터를 복사하지 못하도록합니다.

할당 된 메모리가 완료되면 free()으로 전달됩니다.

을 주목 #include

공지 코드의 일관된 들여 쓰기 : 즉, 모든 여는 중괄호 '{'다음에 들여 쓰기. 모든 닫는 중괄호 '}'앞에서 들여 쓰기를하지 않습니다. 가변 폭 글꼴로도 충분히 넓어서 들여 쓰기 수준마다 4 칸을 사용했습니다. 워드 프로세서마다 탭을 사용하지 마십시오. 편집기에는 탭 스톱/탭 너비가 다르게 설정되어 있습니다.

참고 : struct tm* GetActualTime() 함수가 main() 함수를 포함하는 파일과 별도의 파일에있는 경우 함수의 프로토 타입이 포함 된 '자란 헤더 파일 (작성한 파일)이 있어야합니다. 이 헤더 파일은 main() 함수가 들어있는 파일에 #include d이어야합니다.

이와 같은 보일 것이다 헤더 파일 : 당신이`time.h`를 포함하거나 액세스 권한을 얻을 수 없습니다

#include <stdio.h> // printf() 
#include <stdlib.h> // malloc(), free() 
#include <time.h> // time(), localtime(), time_t, struct tm 
#include <string.h> // memcpy() 

struct tm* GetActualTime() 
{ 
    //VAR DECLARE 
    time_t rawtime; 
    struct tm *timeinfo=malloc(sizeof(struct tm)); 

    time (&rawtime); 
    memcpy(timeinfo, localtime(&rawtime), sizeof(struct tm)); 
    return timeinfo; 
} // end function: GetActualTime 


int main(void) 
{ 
    struct tm *real_time; 

    real_time=GetActualTime(); 
    printf("%d:%d:%d",real_time->tm_hour, real_time->tm_min, real_time->tm_sec); 
    free(real_time); 
} // end function: main 
+0

힙 메모리 할당 함수 중 하나를 호출 할 때 : (malloc, calloc, realloc) 작업이 성공적으로 수행되었는지 확인하기 위해 항상 반환 된 값을 확인하십시오 (! = NULL). . 내가 제공 한 대답에서 그 수표를하지 않았다. – user3629249