2016-08-27 4 views
0

일반 구조체를 만들기 위해 함수 포인터를 사용했습니다. 특정 함수를 호출 할 때 매개 변수 중 하나가 출력 매개 변수입니다. 특정 함수 안에 메모리를 할당하지만 작동하지 않습니다. 도움이 될거야!c에서 void *에 포인터를 전달하고 할당

typedef void *PhaseDetails; 
typedef Result (*Register)(const char *, PhaseDetails *); 

Result Func(const char *file, Register register1){ 
    PhaseDetails firstPhase = NULL; 
    Result res = register1(file, &firstPhase); 
} 

int main() { 
    OlympicSport os = Func("men100mList.txt", (Register) registerMen100m); 
    return 0; 
} 

Result registerMen100m(const char *file, 
    Men100mPhaseDetails *firstPhase) { 
    firstPhase = malloc(sizeof(*firstPhase)); 
    if (firstPhase == NULL) { 
     return OG_MEMORY_ALLOCATION_FAILED; 
    } 
    *firstPhase = malloc(sizeof(**firstPhase)); 
    (*firstPhase)->phaseName = malloc(sizeof(char)*12); 
    return OG_SUCCESS; 
} 

문제는 NULL

+0

'Func'을 절대로 호출하지 않습니다. '결과 osCreate'해야합니까? – Barmar

+1

매개 변수가 값으로 전달 되었기 때문에 (또는 원하는 경우 복사) 매개 변수가 함수에 의해 수정되지 않습니다 (함수는 함수의 복사본을 수정 함). 다른 수준의 간접 참조를 추가하십시오. (대부분의 코드는 잘못되었거나 잘못된 함수 호출, 유형 등). –

+0

"다른 수준의 간접 지정 추가"는 무엇을 의미합니까? – ylilit

답변

0

문제로 firstPhase 반환 당신이에 제일 먼저 같이 registerMen100m() 함수의 firstPhase 인수로 (Func()에 정의) firstPhase에 대한 포인터를 전달하지만 때문이다 함수에서 새로 할당 된 메모리 블록의 주소로 덮어 씁니다. 그 후

Func() 함수 firstPhase의 값이 아니며, 동일한 이름 주위가 samething 수단에만 의미가 사용하는 일반적인 비로서 registerMen100m()

Result registerMen100m(const char *file, Men100mPhaseDetails *firstPhase) 
{ 
    /* At this point, firstPhase holds the address of the variable 
    ** 'firstPhase' you defined in the 'Func()' function. 
    */ 
    firstPhase = malloc(sizeof(*firstPhase)); 
    /* And now it doesnt! So you will never be able to get anything back 
    */ 

    if (firstPhase == NULL) {return OG_MEMORY_ALLOCATION_FAILED;} 

    /* The result of the following malloc is stored in the memory space you 
    ** allocated earlier! If you remove the two lines above you 
    ** should most probably get what you wanted. 
    */ 
    *firstPhase = malloc(sizeof(**firstPhase)); 
    (*firstPhase)->phaseName = malloc(sizeof(char)*12); 
    return OG_SUCCESS; 
} 

내에서 변경 될 수 없다 어디에나. 여기에 두 개의 서로 다른 기능에서 두 가지 의미가있는 firstPhase이 있으며 이는 어떤 일이 일어나고 있는지 추론하기 어렵게 만듭니다. 또한 함수를 인수로 전달하는 것은 거의 필요하지 않은 것입니다. 이 방법으로 프로그램을 구성한 특별한 이유가 있습니까?