2016-10-30 1 views
0

C에서 파일을 읽고 4 자 이상의 모든 문자열을 인쇄해야하는 프로그램을 작성하고 있습니다. 사용할 메모리를 할당하는 데 문제가 있습니다. 문자열은 임의로 길어질 수 있습니다. 나는 파일 크기만큼 버퍼를 malloc하려고 시도하고, 끝에서 그것을 풀어 주지만, 나는 중요한 것을 놓치고있다. 파일과이 실행free() : 다음 크기가 유효하지 않음 (빠른)

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

int main(int argc, char **argv) { 
    FILE *f = fopen(argv[1], "r"); 
    char *buffer = malloc(8 * sizeof(f)); 
    char ch; 
    int i = 0; 

    while(fread(&ch, 1, 1, f) != 0) { 
    if((ch >= 32 && ch <= 126) || ch == 9) { 
     buffer[i++] = ch; 
    } 
    else { 
     buffer[i] = '\0'; 
     if (i >= 4) { 
     printf("%s\n", buffer); 
     } 
     i = 0; 
    } 
    } 

    free(buffer); 
    fclose(f); 
    return 0; 
} 

제대로 모든 문자열 (한 줄에 하나)를 출력 한 후 저에게이 오류 메시지를 제공합니다 : 여기 내 코드입니다.

*** glibc detected *** ./mystrings: free(): invalid next size (fast): 0x0000000000601250 *** 
======= Backtrace: ========= 
/lib64/libc.so.6[0x34ff676166] 
/lib64/libc.so.6[0x34ff678ca3] 
./mystrings[0x4006e9] 
/lib64/libc.so.6(__libc_start_main+0xfd)[0x34ff61ed1d] 
./mystrings[0x400569] 
======= Memory map: ======== 
00400000-00401000 r-xp 00000000 00:1a 94896226       /afs/pitt.edu/home/a/s/asm122/private/cs449/project2/mystrings 
00600000-00601000 rw-p 00000000 00:1a 94896226       /afs/pitt.edu/home/a/s/asm122/private/cs449/project2/mystrings 
00601000-00622000 rw-p 00000000 00:00 0         [heap] 
34fee00000-34fee20000 r-xp 00000000 fd:00 127       /lib64/ld-2.12.so 
34ff01f000-34ff020000 r--p 0001f000 fd:00 127       /lib64/ld-2.12.so 
34ff020000-34ff021000 rw-p 00020000 fd:00 127       /lib64/ld-2.12.so 
34ff021000-34ff022000 rw-p 00000000 00:00 0 
34ff600000-34ff78b000 r-xp 00000000 fd:00 131       /lib64/libc-2.12.so 
34ff78b000-34ff98a000 ---p 0018b000 fd:00 131       /lib64/libc-2.12.so 
34ff98a000-34ff98e000 r--p 0018a000 fd:00 131       /lib64/libc-2.12.so 
34ff98e000-34ff98f000 rw-p 0018e000 fd:00 131       /lib64/libc-2.12.so 
34ff98f000-34ff994000 rw-p 00000000 00:00 0 
3505a00000-3505a16000 r-xp 00000000 fd:00 609       /lib64/libgcc_s-4.4.7-20120601.so.1 
3505a16000-3505c15000 ---p 00016000 fd:00 609       /lib64/libgcc_s-4.4.7-20120601.so.1 
3505c15000-3505c16000 rw-p 00015000 fd:00 609       /lib64/libgcc_s-4.4.7-20120601.so.1 
7ffff7fd3000-7ffff7fd6000 rw-p 00000000 00:00 0 
7ffff7ffa000-7ffff7ffe000 rw-p 00000000 00:00 0 
7ffff7ffe000-7ffff7fff000 r-xp 00000000 00:00 0       [vdso] 
7ffffffea000-7ffffffff000 rw-p 00000000 00:00 0       [stack] 
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0     [vsyscall] 
Aborted (core dumped) 

누군가가 아이디어를 해결하는 방법을 알고 있다면 바보 같은 실수가 될 것이라고 확신합니다. 고맙습니다!

+0

(빠름)? 너 커피도 갖고 싶어? – Stargateur

답변

0

sizeof(f)은 파일의 크기가 아닌 포인터의 f포인터의 크기를 반환합니다. 당신은 임의의 크기의 버퍼를 할당 할 수 있습니다

https://www.tutorialspoint.com/c_standard_library/c_function_fgets.htm이 256 말 : 당신은 여기에 파일의 크기를 얻을하는 방법에 대해 읽을 수 있습니다

는 : fgetsHow can I get a file's size in C?

그러나, 더 좋은 방법은 사용하는 수 있습니다 바이트. 그런 다음 최대 256 바이트 길이의 행을 읽으십시오. 당신이 256보다 작 으면 - 당신은 한 줄을 가지고 있습니다. 그렇지 않으면 - 버퍼의 크기를 늘리고 다시 시도하십시오.

관련 문제