执行free()时“下一个大小无效”

时间:2014-08-14 05:11:37

标签: c malloc 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;

}

5 个答案:

答案 0 :(得分:1)

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

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

下次库将尝试使用存储在那里的信息时,它会发现它不一致,因此它会因您提到的错误而中止。如果它能够找到任何这样的差异,那么这只是图书馆可以打印的许多消息之一。

一般来说,不要依赖图书馆为你标记这些错误:在这种情况下,你是&#34;幸运&#34;信息以可识别的方式被破坏了。如果你运气不好,你的程序可能只会出现未定义的行为。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

执行此行时,

strcpy(b[0], *a);

你正在写你不应该使用的记忆。这导致了未定义的行为。

某些环境在分配的内存块的末尾存储有用的信息。通过写入该内存,您已经破坏了有用的信息。

答案 3 :(得分:0)

错误就在这一行:

strcpy(b[0], *a);

b[0]分配10个字节,但是复制了13个字节,从而写入超出分配内存的末尾。

答案 4 :(得分:0)

因为strlen(a[0]) + 1 > 10而导致缓冲区溢出。您需要为b[0]分配超过10个字符,特别是至少strlen(a[0]) + 1