2012-04-25 5 views
0

이 코드를 컴파일하고 실행할 때 오류가 발생합니다. 오류 메시지는 다음과 같습니다realloc() : 다음 크기가 유효하지 않음 : 0x0000000002119010

realloc(): invalid next size: 0x0000000002119010

파일 input은 약 4000 단어를 가지고있다.

디버깅했지만 문제는 찾을 수 없습니다.

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

#define BUF_LEN 10 //buf length 

int main(int argc, char *argv[]) 
{ 
    int file_d;      //file descriptor 
    char *ct_head;     //content_first_char 
    char *content; 
    ssize_t read_len = BUF_LEN;  //had read length 
    int mem_block_count = 0; 

    file_d = open("input", O_RDONLY); 

    if (file_d < 0) 
    { 
     perror("open"); 
     exit (1); 
    } 

    content = ct_head = (char *) malloc(sizeof(char) * BUF_LEN); 
    mem_block_count = 1; 

    while (read_len == BUF_LEN) 
    { 
     read_len = read(file_d, ct_head, BUF_LEN); 
     if (read_len < 0) 
     { 
      perror("read"); 
      exit(2); 
     } 
     if (read_len == BUF_LEN) 
     { 
      ct_head = (char *)realloc(content, sizeof(char) *(++mem_block_count)); 
      ct_head = &content[(mem_block_count-1) * BUF_LEN]; 
     } 
     else 
     ct_head[read_len] = '\0'; 
    } 
    printf("%s", content); 

    close(file_d); 
    free(content); 
    return 0; 
} 
+0

'realloc'에서'(char *) realloc (content, sizeof (char) * (++ mem_block_count) * BUF_LEN); – Naveen

+0

realloc 후 컨텐츠가 유효하지 않을 수 있습니다 (realloc에 ​​의해 해제되었을 수 있음). 제 생각에는 ct_head가 아닌 realloc이 반환 한 포인터를 할당해야한다고 생각합니다. – qbert220

+1

[malloc/realloc 함수의 반환 유형을 형 변환하지 마십시오.] (http://stackoverflow.com/a/605858/1151654)주의하십시오. – Eregrith

답변

0

나는 당신의 문제가이 선에 불과하다 모르겠어요 :

ct_head = (char *)realloc(content, sizeof(char) *(++mem_block_count)); 
    ct_head = &content[(mem_block_count-1) * BUF_LEN]; 

은 매우 사기입니다. 첫 번째 줄 다음에 ct_head은 재 할당 된 블록을 가리키고 content은 쓰레기를 가리 킵니다. 그런 다음 두 번째 줄은 content을 읽고 ct_head - 재 할당 된 메모리를 다시 할당합니다.

프로그램에 메모리가 손상되었을 수도 있습니다.

나는

ct_head = (char *)realloc(content, sizeof(char) *(++mem_block_count)); 

가 있어야한다고 생각 : 통화로가는 sizeof(char)가 1이고 mem_block_count도 1이기 때문에

content = (char *)realloc(content, sizeof(char) *(++mem_block_count) * BUF_LEN); 
if (content == NULL) 
{ 
    // do something if the realloc fails 
} 
+0

예, 작동합니다. 나는이 실수를 다시하지 않을 것입니다! 감사합니다! – thlgood

0

당신이 realloc을을 처음 사용할 때, 그것은 단지 2 바이트를 할당 (그리고 나서 그것은 2로 미리 증분된다).

이는 다음 읽기가 할당 한 버퍼를 오버런 함을 의미합니다. 당신도 당신의 realloc에 ​​BUF_LEN을 곱해야한다고 생각합니다.

난 그냥 깨달았다

편집, 심지어 더 나쁜 : 직선 2 바이트에 내용을 할당 한 후, 콘텐츠의 시작을 넘어 ct_headBUF_LEN 바이트를 설정합니다. 즉, 버퍼가 완전히 벗어난 영역을 덮어 쓰게됩니다.

0

당신은 이미 여기에 좋은 해답을 얻었지만 여기에는 의견에 맞지 않는 약간의 조언이 있습니다. C에서 sizeof(char)이고 항상입니다. 1은 정의상 1이므로 (1 * BUF_LEN)을 사용하는 것처럼 중복됩니다. 또한 C에서는 malloc의 결과를 캐스팅하지 않아도됩니다. 이렇게하면 근본적인 오류 을 가릴 수 있습니다.

당신은 형의 크기에 따라 공간을 할당하기 위해 사용하려는 경우 :

ct_head = malloc(sizeof(*ct_head) * BUF_LEN); 

그런 식으로, ct_head 변경의 유형, 당신은 여전히 ​​충분한 공간을 할당 할 수 있을지 변경하지 않고도를 mallocrealloc에 대한 모든 통화.

1. malloc에 해당하는 헤더를 포함하지 않는 경우, C 컴파일러는 int의 크기가 포인터 타입의 크기와 다른 곳 malloc 반환 int는,이 플랫폼에 문제를 일으킬 수 있다는 것을 가정한다 .또한 정수 유형에서 포인터 유형으로의 변환은 구현에 따라 정의됩니다.

관련 문제