free() 释放动态分配内存出错,原理是什么

这个程序是用来测试用动态分配内存的方式创建一维数组的。
但是我发现只要这个循环变量i超过了3,一旦释放动态内存就会出错。
目前只知道,比如当i=4的时候,赋值的地址就会超过所分配的动态内存空间。
但这个原理是什么?求助
谢谢!!!

void main()
{
  double *arr = (double *)malloc(24);
  for (int i = 0; i < 3; i++)
  {
    arr[i] = i + 1;
    printf("%f\n", arr[i]);
  }
  free(arr);//只要i超过3个 执行free就会出问题
  getchar();
}
阅读 3k
2 个回答

问题出在 i=4 的时候,你去写了 arr[i]。

When you allocate space (such as with strdup) the a tiny amount of extra space is allocated before and after the chunk you requested and that extra is used for data that is needed when you free your chunk.

你使用 malloc ,实际上系统会在为你在给你返回的内存地址前后分配额外的内存,这段内存记录了你申请的空间大小等元信息。

而你越界访问后,就改写了这段范围后面的额外内存,然后 free() 是要依赖这里的信息的。

你可以试试 如果不去写越界,而只是读 arr[4], 就不会报错了!

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进