在 Linux 操作系统上使用 C 语言中的动态数组时检测到 glibc



我正在尝试声明一个动态数组,以便它可以读取 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      ******/

有人可以帮我解决这个问题吗?谢谢。

您正在用numsizeof(char)的乘积调用malloc。值num未初始化为任何内容。因此,当您调用 malloc 时,您正在分配随机数量的内存。应将num设置为等于要读取的字节数或更大。我建议按照这些思路修改你的代码

num = 100;
buffer = malloc(sizeof(char)*num))
int err = fread(buffer,sizeof(char),num,fp);

这样,您不会读取比buffer中可用的数据更多的数据。此外,还应检查 freadmalloc 的返回值是否存在可能的错误。 malloc可以在出错时返回 NULL 指针,fread可以返回零。您需要使用ferror来获取确切的错误。

最新更新