【问题标题】:Got "invalid next size" when executing free()执行 free() 时出现“无效的下一个大小”
【发布时间】:2014-08-14 05:11:36
【问题描述】:

我正在尝试学习 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;

}

【问题讨论】:

标签: c malloc free


【解决方案1】:

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

您为其分配的内存是不够的(您只分配了 10 个字符),因此当调用 strcpy 时,您将覆盖已分配的内存,并且可能会覆盖库使用的内存位置以跟踪分配。

库下次尝试使用其中存储的信息时,发现不一致,因此中止并出现您提到的错误。如果图书馆能够找到任何此类差异,这只是图书馆可以打印的众多消息之一。

通常,不要依赖库为您标记这些错误:在这种情况下,您“幸运”的是信息以可识别的方式损坏。如果你运气不好,你的程序可能只是表现出未定义的行为。

【讨论】:

  • 从技术上讲,这不是可能表现出未定义行为的问题——它未定义的行为。这包括 OP 遇到的错误。
【解决方案2】:

对于每个b[i],你只为10个chars分配空间,但是strcpy复制了字符串"Hello Again!",肯定比10个chars多。这是未定义的行为。

【讨论】:

    【解决方案3】:

    当你执行这一行时,

    strcpy(b[0], *a);
    

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

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

    【讨论】:

      【解决方案4】:

      错误是这一行:

      strcpy(b[0], *a);
      

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

      【讨论】:

        【解决方案5】:

        这是一个缓冲区溢出,因为strlen(a[0]) + 1 &gt; 10。你需要为b[0]分配超过10个字符,特别是至少strlen(a[0]) + 1

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-03-28
          • 2018-05-20
          • 1970-01-01
          • 1970-01-01
          • 2012-10-23
          • 2017-03-12
          • 1970-01-01
          相关资源
          最近更新 更多