【问题标题】:glibc detected when using dynamic array in C on a linux OS在 Linux 操作系统上使用 C 中的动态数组时检测到 glibc
【发布时间】: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


    【解决方案1】:

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

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

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

    【讨论】:

    • 另请注意sizeof(char) 始终为 1,并且是无用的噪音
    猜你喜欢
    • 2016-03-13
    • 2012-11-07
    • 1970-01-01
    • 2018-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多