我正在尝试声明一个动态数组,以便它可以读取 100 字节的内容并将其存储到 char *buffer 中。当它是 fread 函数具有少量的 size_t nmemb 时,它工作得很好,例如 10。但是当我将其设置得更高时,它会显示一些内容,但给我一个 glibc 检测到的错误。
如果在 fread 函数中将其设置为一个小数字,这就是它的工作原理
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main()
{
FILE *fp;
int num;
char *buffer;
buffer=(char*)malloc(sizeof(char)*num);
memset(buffer.0,sizeof(char)*num);
/* Open file for reading */
fp = fopen("hello.txt", "r");
/* Read and display data */
fread(buffer, 1, 10, fp);
printf("%sn", buffer);
free(buffer);
fclose(fp);
return(0);
}
/*************** Ouput *****************/
travis@ubuntu:~$ g++ -o fileread2 fileread2.c
travis@ubuntu:~$ ./fileread2
asdkfjasdk
当我将其从 fread 中的第 3 个 arg 更改为 100 时,就会发生这种情况:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main()
{
FILE *fp;
int num;
char *buffer;
buffer=(char*)malloc(sizeof(char)*num);
memset(buffer.0,sizeof(char)*num);
/* Open file for reading */
fp = fopen("hello.txt", "r");
/* Read and display data */
fread(buffer, 1, 100, fp);/*This is all I changed*/
printf("%sn", buffer);
free(buffer);
fclose(fp);
return(0);
}
/************* Output ********************/
travis@ubuntu:~$ g++ -o fileread2 fileread2.c
travis@ubuntu:~$ ./fileread2
asdkfjasdk;ljfkadsljck;lasm
asdkjdasfkja�s;kljfa
sdfksadjf;kljads;lkjads;lkjfadslkja
dsasdkfj;dsjf;a�
*** glibc detected *** ./fileread2: free(): invalid next size (fast): 0x0000000000d88010 ***
======= Backtrace: =========
/lib/x86_64-linux-gnu/libc.so.6(+0x7eb96)[0x7fb2aa586b96]
./fileread2[0x4007c8]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xed)[0x7fb2aa52976d]
./fileread2[0x400659]
======= Memory map: ========
00400000-00401000 r-xp 00000000 07:00 785332 /home/travis/fileread2
00600000-00601000 r--p 00000000 07:00 785332 /home/travis/fileread2
00601000-00602000 rw-p 00001000 07:00 785332 /home/travis/fileread2
00d88000-00da9000 rw-p 00000000 00:00 0 [heap]
7fb2aa2f0000-7fb2aa305000 r-xp 00000000 07:00 265977 /lib/x86_64-linux-gnu/libgcc_s.so.1
7fb2aa305000-7fb2aa504000 ---p 00015000 07:00 265977 /lib/x86_64-linux-gnu/libgcc_s.so.1
7fb2aa504000-7fb2aa505000 r--p 00014000 07:00 265977 /lib/x86_64-linux-gnu/libgcc_s.so.1
7fb2aa505000-7fb2aa506000 rw-p 00015000 07:00 265977 /lib/x86_64-linux-gnu/libgcc_s.so.1
7fb2aa508000-7fb2aa6bd000 r-xp 00000000 07:00 281111 /lib/x86_64-linux-gnu/libc-2.15.so
7fb2aa6bd000-7fb2aa8bd000 ---p 001b5000 07:00 281111 /lib/x86_64-linux-gnu/libc-2.15.so
7fb2aa8bd000-7fb2aa8c1000 r--p 001b5000 07:00 281111 /lib/x86_64-linux-gnu/libc-2.15.so
7fb2aa8c1000-7fb2aa8c3000 rw-p 001b9000 07:00 281111 /lib/x86_64-linux-gnu/libc-2.15.so
7fb2aa8c3000-7fb2aa8c8000 rw-p 00000000 00:00 0
7fb2aa8c8000-7fb2aa8ea000 r-xp 00000000 07:00 281123 /lib/x86_64-linux-gnu/ld-2.15.so
7fb2aaae6000-7fb2aaaea000 rw-p 00000000 00:00 0
7fb2aaaea000-7fb2aaaeb000 r--p 00022000 07:00 281123 /lib/x86_64-linux-gnu/ld-2.15.so
7fb2aaaeb000-7fb2aaaed000 rw-p 00023000 07:00 281123 /lib/x86_64-linux-gnu/ld-2.15.so
7fb2aaaed000-7fb2aaaf1000 rw-p 00000000 00:00 0
7fffdf9a2000-7fffdf9c3000 rw-p 00000000 00:00 0 [stack]
7fffdfa00000-7fffdfa02000 r-xp 00000000 00:00 0 [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall]
Aborted (core dumped)
/***** End of Output ******/
有人可以帮我解决这个问题吗?谢谢。
您正在用num
和sizeof(char)
的乘积调用malloc
。值num
未初始化为任何内容。因此,当您调用 malloc
时,您正在分配随机数量的内存。应将num
设置为等于要读取的字节数或更大。我建议按照这些思路修改你的代码
num = 100;
buffer = malloc(sizeof(char)*num))
int err = fread(buffer,sizeof(char),num,fp);
这样,您不会读取比buffer
中可用的数据更多的数据。此外,还应检查 fread
和 malloc
的返回值是否存在可能的错误。 malloc
可以在出错时返回 NULL 指针,fread
可以返回零。您需要使用ferror
来获取确切的错误。