2012-04-26 3 views
1

다른 함수에서의 malloc()에 의해 할당 무료() 값 :수 없습니다 나는이 같은 뭔가 C 기능이

void foo(char ** out) { 
    *out = malloc(computedsize); 
    if(*out != NULL){ 
     sprintf(*out, "%s,%s", foovar, baa); 
     } 
} 

하고 내가 전화 : 내가 전화

int main(void) { 
    char * out = NULL; 
    foo(&out); 
    printf("%s\n", out); /* so far, it works fine */ 
    free(out); /* the problem. */ 
} 

:

free(out);

는 주어진 :

*** glibc detected *** ./a.out: free(): invalid next size (fast): 0x09a03050 *** 
======= Backtrace: ========= 
/lib/tls/i686/cmov/libc.so.6(+0x6b161)[0x4ff161] 
/lib/tls/i686/cmov/libc.so.6(+0x6c9b8)[0x5009b8] 
/lib/tls/i686/cmov/libc.so.6(cfree+0x6d)[0x503a9d] 
./a.out[0x804875b] 
./a.out[0x804871a] 
./a.out[0x80486f9] 
/lib/tls/i686/cmov/libc.so.6(__libc_start_main+0xe6)[0x4aabd6] 
./a.out[0x8048601] 
======= Memory map: ======== 

// 복사 메모리 맵 부분이 필요합니까?

누군가 내 실수를 지적 할 수 있습니까? 나는 그것이 sprintf()라고 생각한다. .. 또는 실제로, 나는 전혀 모른다. 나는 그것에 대한 함수 할당 값 내에서 새로운 변수를 만들려고했다. 그리고 *out = myvariable;*out = strdup(myvariable)을 호출했지만 free() 호출은 같은 오류를 준다. 어떤 도움이라도 대단히 감사합니다. 미리 감사드립니다.

UPDATE :

나는 문제가 함수 내에서입니다 것을 알 수있다. free()을 호출하면 잘못된 다음 크기가됩니다. 예를 들어

:

char *f=malloc(2); 
strcpy(f,"a"); 
free(f); 

foo() 내부 기능은 main() 기능을 정상적으로 작동 위의 오류를 가져옵니다. 이 문제를 해결하는 방법을 완전히 잃어 버렸습니다.

+1

함수를 문자열로 인쇄하려고합니까? 그게 정확히 어떻게 작동할까요? – FatalError

+1

computedsize가 너무 작아서 할당 된 공간의 끝을 지나쳐 덮어 쓰고 있습니다. –

+0

sprintf보다 안전한 [snprintf] (http://linux.die.net/man/3/snprintf)를 사용해보십시오. – Mahesh

답변

0

솔루션 :

문제 예상대로() 선언이 너무 malloc()을 다른 함수를 호출하지만, if() 내에서 호출 기능이 작동하지 않는 경우 실제로 이전 malloc() 하나 구해있었습니다 cosequently 일부 잘못된 값을 저장합니다. 이로 인해 힙 손상이 발생했습니다.

5

할당 된 배열의 범위를 넘어서서 힙을 손상 시켰습니다 (/ free 등의 메타 데이터가 포함되어 있음).

Valgrind와 같은 도구는 이러한 종류의 오류를 찾는 데 도움을 주도록 설계되었습니다.

+0

고마워요. 나는 지금 따라야 할 방향이있다. 나는 언젠가 전에 valgrind를 시도했지만 어떤 상황에서도 나를 위해 작동하지 않는다. 응용 프로그램이 단순히 충돌한다. – Jack

+0

내 업데이트를 확인하십시오. :) – Jack

0

나를 위해 작동하지만 computsize foo 또는 baa가 없습니다. 나는 당신이 아마 할당 한 기억의 끝을 넘어 서면 아마 동의했다.

#include <stdio.h> 
#include <stdlib.h> 

#define COMPUTEDSIZE 1024 
void foo(char ** out) { 
    *out = malloc(COMPUTEDSIZE); 
    if(*out != NULL){ 
     sprintf(*out, "%s,%s", "foo", "baa"); 
     } 
} 
int main(int argc, char * argv[]) { 
    char * out = NULL; 
    foo(&out); 
    printf("%s\n", out); /* so far, it works fine */ 
    free(out); /* the problem. */ 
    exit(0); 
}