c语言 - 执行 free() 时出现"下一个大小无效"



我想学习c的内存管理。

我为 分配了内存
1. char** a
2. char** b
3. char* b[0] ~ b[99]

释放内存
1. char** a
2. char* b[0] ~ b[99]
3. char** b

然而,我在第33行得到了一个错误,这是free(b[0])

为什么会产生invalid next size free (fast) ?

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main()
{
  char** a = (char**)malloc(100 * sizeof(char*));
  a[0] = "Hello Again!";

  char** b = (char**)malloc(100 * sizeof(char*));
  int i = 0;
  for(i = 0; i < 100; i++){
    b[i] = (char*)malloc(10 * sizeof(char));
  }
  strcpy(b[0], *a);
  free(a);
  printf("%s", b[0]);
  for(i = 0; i < 100; i++){
      free(b[i]);
  }
  free(b);
  return 0;
}

字符串"Hello Again!"长度为13个字符(包括终止符)

你为它分配的内存是不够的(你只分配了10个字符),所以当调用strcpy时,你覆盖了超过分配的内存,并且可能覆盖了库用来跟踪分配的内存位置。

下一次库将尝试使用存储在那里的信息时,它发现它不一致,因此它以您提到的错误终止。这只是标准库能够打印的众多消息之一,如果它能够找到任何这样的差异的话。

一般来说,不要依赖库为您标记这些错误:在这种情况下,您很幸运,因为信息以可识别的方式损坏了。如果不走运,您的程序可能会显示未定义的行为。

对于每个b[i],您只为10个char s分配空间,但是strcpy复制字符串"Hello Again!",这肯定超过10个char s。

当您执行这一行时,

strcpy(b[0], *a);

你正在写你不应该使用的内存。这会导致未定义的行为。

一些环境将有用的信息存储在分配的内存块的末尾。通过写入内存,您已经销毁了有用的信息。

错误如下:

strcpy(b[0], *a);

您为b[0]分配了10个字节,但是您复制了13个字节,因此写入超出了已分配内存的末尾。

这是缓冲区溢出,因为strlen(a[0]) + 1 > 10。您需要为b[0]分配10个以上的字符,特别是至少strlen(a[0]) + 1

相关内容

  • 没有找到相关文章