运行时错误:*** glibc检测到***

时间:2016-04-02 19:48:37

标签: c pointers malloc glibc realloc

我正在尝试随机的事情来了解更多关于malloc,realloc和free以及它们在一起使用时的行为方式。

我会将代码和我的想法包含在我想要做的事情中。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main(void)
{
   char *str;

   /* Initial memory allocation */
   str = (char *) malloc(15);
   strcpy(str, "63tczfqV4nqB2YnH9iFJbGvGyyDkvK341rrj0G0mo1PEYniOVHejVIFIQnJzHSSMRbuyGMCZ4M5HFMV4y1q4QgYqyxp2XkTjxaolKTkaw1r25S2Emz061tw1");
   printf("String = %s,  Address = %u\n", str, *str);

   /* Reallocating memory */
   str = (char *) realloc(str,16);
   strcat(str, "12345678");
   printf("String = %s,  Address = %u\n", str, *str);

   free(str);
   return 0;
}

我希望我的代码行为如下:

  1. 我使用malloc创建了一个字符类型的内存指针指向(最多)15个字节的内存。
  2. 使用该字符指针,我使用strcpy保存了120个字符。
  3. 我将字符指针调整为现在指向(最多)16个字节。
  4. 我使用strcat将另外8个字符连接到已经容纳120个字符的内存缓冲区。
  5. 现在,我的字符指针应指向128个字符并且我尝试重现它,但是,它失败了128个字符(但打印了使用strcpy保存的前120个字符)。
  6. 确切的错误是:

     ***** glibc detected *** ./a.out: realloc(): invalid next size: 0x0000000001690010 *****
    

    并且控制台挂在这上面,也就是说,它从未移过 realloc 这一行?

1 个答案:

答案 0 :(得分:4)

让我们看一下代码的前两行:

str = (char *) malloc(15);
strcpy(str, "63tczfqV4nqB2YnH9iFJbGvGyyDkvK341rrj0G0mo1PEYniOVHejVIFIQnJzHSSMRbuyGMCZ4M5HFMV4y1q4QgYqyxp2XkTjxaolKTkaw1r25S2Emz061tw1");

此时,您已经破坏了C语言的规则。 strcpy将写入str的末尾,导致未定义的行为。

在这一点之后发生的一切都有点在空中。