2013-03-12 3 views
0

구조체의 배열을 할당하려고합니다. 값을 초기화하고 함수 내에서 값을 인쇄하려고하면 모든 것이 잘됩니다. 가서 main에 같은 값을 출력하면 프로그램이 다운됩니다.C를 사용하는 구조체의 동적 할당

void getHeader(FILE* fpFile, HEADER *pHead) 
{ 
    // Local Declaration 
    int worker, salesWeek, i; 
    PERSON *list; 

    // Statement 
    fscanf(fpFile, "%d %d", &worker, &salesWeek); 
    list = aloPerson(worker); 
    HEADER header = {worker, salesWeek, list}; 
    pHead = &header; 

    return; 
}// getHeader 


PERSON* aloPerson(int worker) 
{ 
    // Local Declaration 
    PERSON *list; 

    // Statement 
    list =(PERSON*)calloc(worker, sizeof(PERSON)); 
    if(list == NULL) 
    { 
     MEM_ERROR, exit(103); 
    } 

    return list; 
}// aloPerson 

이것은 내 구조체입니다.

typedef struct 
{ 
int worker; 
int weeks; 
PERSON *pAry; 
}HEADER; 

이 메인입니다 :

HEADER header = {worker, salesWeek, list}; 
pHead = &header; 

가 될 :

HEADER header = {worker, salesWeek, list}; 
*pHead = header; 
또한

확인 pHead을

int main (void) 
{ 
// Local Declaration 
FILE* fpFile; 
char nameIn[25]; 
char *endPro = "end"; 
HEADER *pHead; 

// Statement 
printf("Please select file to to open.\nsales or sales_2: "); 
scanf("%s", nameIn); 
FLUSH; 

do 
{ 
    valiFile(nameIn); 
    fpFile = openFile(nameIn); 
    getHeader(fpFile, pHead); 
    readFile(fpFile, pHead); 

    repeat(nameIn); 
} 
while(strcmp(nameIn, endPro) != 0); 


return 0; 
+0

로컬 스택에 할당 된 구조체에 대한 포인터를 다시 전달하기 때문입니다. 동적으로 헤더를 할당해야합니다. – Nick

+0

getHeader는 메모리 누수와 현재 상태의 일부 콘솔 IO를 나타냅니다. 아마 당신이 찾고있는 것이 아닙니다. – WhozCraig

+2

@ 닉 다시 한번 확인해보세요. 그는 그걸 돌려 보내지도 않습니다. – WhozCraig

답변

5

난 당신이 코드 줄을 변경할 필요가 있다고 생각 그렇지 않은 경우는 null return null null param. 동적으로 가고 싶다면 calloc을 사용하여 헤더 변수를 할당하면 오래된 코드를 사용할 수 있습니다.

또한 무료 것을 잊지 마세요이 줄

HEADER *pHead; 

HEADER *pHead = (HEADER*)calloc(1, sizeof(HEADER)); 

으로 변경되는 주요 기능에 있는지 확인하십시오.

+0

+1 'pHead'가 실제로 할당 된 (범위 또는 동적 인) HEADER 구조를 참조하는 경우, 이것은 실제로 맞습니다. 그것은 알몸 포인터 일 뿐이며, OP는 여전히 할 일이 있습니다. 우리는 호출자 측을 볼 수 없으므로 실제로 모르지만, 올바른 구조 주소라고 가정하면이 작동합니다. OP의 코멘트 "구조체의 배열을 할당하려고합니다."는 이야기의 절반이 될 수도 있습니다. – WhozCraig

+0

난 그냥 위의 발췌 문장을 시도하고 내 프로그램이 여전히 충돌합니다. 어쩌면 내가 메인에서 잘못하고있는 것일 수도 있습니다. 내 주요 상판을 포함 할 것입니다. 미안 해요, 구조가 처음인데 죽이려고 해요. – Nathan

+0

@MahmoudFayez - 고마워요. 코드를 수정했는데 이제는 잘 작동합니다. 물어 보는 것이 그리 많지 않다면, 내가 작동하도록 * pHead를 위해 메모리를 할당해야하는 이유에 대한 논리를 나에게 설명해 주시겠습니까? – Nathan

관련 문제