【发布时间】:2014-03-03 22:54:27
【问题描述】:
我正在尝试声明一个动态数组,以便它可以将 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("%s\n", buffer);
free(buffer);
fclose(fp);
return(0);
}
/*************** Ouput *****************/
travis@ubuntu:~$ g++ -o fileread2 fileread2.c
travis@ubuntu:~$ ./fileread2
asdkfjasdk
当我将 fread 中的第三个参数更改为 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("%s\n", 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 ******/
有人可以帮我解决这个问题吗?谢谢。
【问题讨论】:
标签: arrays dynamic malloc glibc fread