Run-time error: *** glibc detected ***

Run-time error: *** glibc detected ***

我正在尝试一些随机的事情,以便更多地了解 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 个字符)。

确切的错误是:

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

并且控制台挂在这个上面,也就是说,它从未移动过我想的 realloc 行?

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

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

至此,你已经打破了C语言的规则。 strcpy 将写入到 str 的末尾,这会导致未定义的行为。

这一点之后发生的一切都悬而未决。