我正在用C写一个程序,我需要读取一个文件,并打印出至少4个字符长的每个字符串。我有一个问题分配内存使用。字符串可以任意长。我试图将缓冲区malloc到文件的大小,然后在最后释放它,但我显然错过了一些重要的东西。下面是我的代码:
#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] = ' ';
if (i >= 4) {
printf("%sn", buffer);
}
i = 0;
}
}
free(buffer);
fclose(f);
return 0;
}
在文件中运行此命令,正确输出所有字符串(每行1个),然后给我这个错误消息。
*** 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)
我肯定这是一个愚蠢的错误,如果有人有任何想法如何解决这个问题,请告诉我。谢谢你!
sizeof(f)
返回f
指针的大小,而不是文件的大小。
你可以在这里阅读如何获取文件大小:how can I get a file's size in C?
然而,一个更好的方法可能是使用fgets
: https://www.tutorialspoint.com/c_standard_library/c_function_fgets.htm
你可以分配一个任意大小的缓冲区,比如256字节。然后尝试读取长达256字节的行。如果小于256,就会有一个while行。