2012-06-07 5 views
2

내 코드의 한 섹션을 참조하는 valgrind에서 여러 가지 오류가 발생했습니다. 기본적으로 큐로 작동하는 구조체의 연결된 목록이 있습니다. 여기에 내 대기열 기능이 있습니다 :Valgrind 잘못된 읽기

PcbPtr enqPcb(PcbPtr *headofQ, PcbPtr process){ 
    PcbPtr c = *headofQ; 
    PcbPtr d = c; 
    if (!*headofQ) { 
     *headofQ = process; 
     return *headofQ; 
    } 
    while (c->next) { 
     c = c->next; 
    } 
    c->next = process; 
    return d; 
} 

PcbPtr은 구조체에 대한 포인터입니다. Valgrind는 while 루프에서 "조건부 점프 또는 이동은 초기화되지 않은 값에 따라 달라집니다"등 모든 종류의 물건을 제공합니다. 거기에 눈에 띄게 틀린 점이 있거나 Ive에 포함 된 것의 범위를 벗어납니다. 감사

+0

관련없는 문제로하지만, '* headofQ'를 직접 돌려 줄 수 있습니까? –

+0

좋은 질문입니다. 나는 그것이 일부 디버깅의 잔재라고 생각한다. – Milk

+1

@JoachimPileborg : 아까, 필자는 시작 프로그래머가 그러한 중간 변수를 사용하는 것을 반복적으로 보았다. 나는 이유를 모른다. 많은 초창기 프로그래머들의 심리에 뭔가가 있습니다. 이것은 매우 일반적입니다. (반면에, 작전 스타일은 적당히 성숙해 보입니다. 따라서 중급은 그의 경우에 코드의 사전 수정 결과물이 될 것 같지 않습니다.) – thb

답변

0

당신의 next 멤버를 intialising 고려해 볼 수 있습니다 무엇을 (이미 enqPcb()를 호출하기 전에 수행하지 않은 경우) process가 언급되어 중간 변수`d`를 사용하는 이유는, 때

PcbPtr enqPcb(PcbPtr *headofQ, PcbPtr process){ 
    PcbPtr c = *headofQ; 
    PcbPtr d = c; 
    process->next = NULL; 

    ...