2011-07-29 4 views
0

디버깅하려는 C에 LDA 코드가 있는데 지금 당장 머리를 부딪 혔습니다.함수에서 반환 된 값을 재 할당하면 seg 오류가 발생합니다.

lda_model *model = NULL; 
model = malloc(sizeof(lda_model)); 
model = quiet_new_lda_model(corpus->num_terms, NTOPICS); 
printf ("%f\n", model->alpha); // Segfaults here 

우리가 quiet_new_lda_model 기능과 원래 발신자 사이의 거래에서 문제가 될 수 무엇 모델 생성 기능

lda_model* quiet_new_lda_model(int num_terms, int num_topics) { 
    int i; 
    lda_model* model; 

    model = malloc(sizeof(lda_model)); 
    model->num_topics = num_topics; 
    model->num_terms = num_terms; 
    model->alpha = 1.0; 
    printf ("%f\n", model->alpha); // Prints 1.0 
    model->log_prob_w = malloc(sizeof(double*)*num_topics); 
    for (i = 0; i < num_topics; i++) 
    { 
     model->log_prob_w[i] = malloc(sizeof(double)*num_terms); 
    memset(model->log_prob_w[i],0,sizeof(double)*num_terms); 
    } 
    printf ("%f\n", model->alpha); // Prints 1.0 
    return(model); 
} 

보면?

감사합니다.

+2

하지 실패의 malloc()를 확인의 팬이 도움이 될 것입니다 change..Maybe에 대한 '% f를'반대로 '% ld 개'를 사용해보십시오, 나는 ... 볼 – Josh

+0

을 주석 model-> log_prog_w를 처리하고 여전히 충돌하는지 확인하는 코드 – James

답변

5

먼저, 호출자의 malloc은 불필요하며 메모리 누수의 원인이됩니다. 이 4 줄을 대체 해보십시오.

lda_model *model = quiet_new_lda_model(corpus->num_terms, NTOPICS); 
printf ("%f\n", model->alpha); // Segfaults here 

하지만 세그 폴트의 원인이 될 가능성은 거의 없습니다. 다음 질문은 발신자가 quiet_new_lda_model의 프로토 타입인지 확인하는 것입니다. 그렇지 않으면 포인터가 int으로 잘 렸습니다. 세 번째 printf이 처음이 아닌 다른 값을 출력하면 당신은

printf("%p\n", model); 

을 읽을 수있는 printf 라인의 세 가지를 모두 변경하여 찾을 수 있습니다, 누락 된 프로토 타입은 문제가 될 가능성이 높습니다.

test.c:4: warning: initialization makes pointer from integer without a cast 

말씨는 상황과 어떤 컴파일러를 사용중인에 따라 다를 수 있습니다 :

편집 : 당신이 누락 된 프로토 타입이 같은 경고 메시지를 찾는 것입니다 경우 또 다른 방법은 말씀합니다. 당신은 GCC를 사용하는 경우, 강한 힌트를 얻을 수있는 -Wall 명령 줄 스위치를 사용

test.c:4: warning: implicit declaration of function ‘quiet_new_lda_model’ 
test.c:4: warning: initialization makes pointer from integer without a cast 

"암시 적 선언은"그래서 그것을 가정 할 것입니다이 기능에 대해 말하지 않 았 아무것도 "의미 임의의 수의 매개 변수를 사용하고 int을 반환합니다. 상상할 수 있듯이, 이것은 거의 항상 잘못된 것입니다.

(당신은 GCC를 사용하는 경우 일반적으로, 당신은 항상 명령 행에 -Wall이 있어야합니다.) 모든

+0

맞습니다. quent_new_lda_model 호출 직후의 printf ("% p \ n", model)는 다른 숫자입니다. 누락 된 프로토 타입은 어떻게 수정합니까? 첨부 된 헤더 파일에서 수정 한 내용입니까? – Rio

+0

이것이 문제인지 확인하려면 lda_model * quiet_new_lda_model (int, int);을 입력하십시오. 코드 파일의 맨 위에 (첫 번째 블록). –

+0

'quiet_new_lda_model' 함수를 작성 했습니까? 아니면 사용중인 라이브러리의 함수입니까? 라이브러리에서 가져왔다면 이미 프로토 타입을 선언하는 헤더 파일이 있어야합니다. # 헤더를 포함하십시오. 그것이 여러분의 코드라면, 프로토 타입과 함께 헤더 파일을 만들거나 이미 가지고있는 헤더에 프로토 타입을 추가해야합니다. – zwol

1

이것은 해결책은 아니지만 메모리 누수가 있습니다. 함수에 할당되었으므로 첫 번째 코드 블록에 모델을 할당하면 안됩니다.

@Zack에서 제안한 실제 근본 원인은 의심 스럽습니다. 프로토 타입이 없으므로 반환되는 주소가 잘리지 않습니다 (64 비트 시스템에 있다고 가정 함).

코드의 첫 번째 블록의 상단에 사용

lda_model* quiet_new_lda_model(int, int); 

.

0

먼저,없이 quiet_new_lda_model 기능에 malloc을하고 메모리 누수가 이전에 주장 된 자원을 해제합니다. 호출자에서 malloc을 수행 할 필요는 없습니다. 둘째, lda_model은 어디에/어떻게 정의되어 있습니까? 함수를 호출 한 파일에 헤더 파일이 포함되어 있습니까?

0

lda_model의 정의를 최근에 변경하셨습니까? 변경 후에 사용하는 모든 소스 파일을 재 컴파일 했습니까?

0

코드에서 명백한 버그를 수정했습니다. 당신은 고칠 필요가 메모리 누수가있어. 두 번째로 더 높은 함수에서 코드를 다시 디버깅하려면 if (model) printf ("% f", model-> alfa); 당신이 앞으로 나아갈 수 있도록 도와 주어야합니다. 예측할 수는 없지만 때로는 스택 어설 션이 segfault를 만들 수 있습니다.

업데이트 :이

관련 문제