Linux上的C free()报告无效的下一个大小错误,数组指针,相同的代码传递给mac

时间:2014-10-05 22:49:50

标签: c linux macos pointers

我有以下C程序,其中malloc是一个二维数组,并在免费部分报告

*检测到glibc * ./a.out:free():下一个尺寸无效(快):0x0000000000e05070 ***

带有回溯。

我在linux服务器上尝试了相同的代码并得到了同样的错误。但是,相同的代码完全适用于我朋友的Mac。

我想知道这是否是操作系统特定问题(例如编译器的差异)? 或者我以不恰当的方式做了一些事情但被mac OS忽略了?

# include <stdlib.h>

# define N 10 

int main(){
  int size = N+1;

  //memory allocation
  float **m = malloc((size)*sizeof(float*));
  int i;
  for (i=0; i<size; i++)
    m[i] = malloc((size)*sizeof(float));

  // ... do some work

  //free
  for (i=0; i<size; i++){
    printf("free: %d", i);
    free(m[i]);
    printf(" freed.\n");
  }

  free(m);
  printf("m freed.\n");

  return 0;
  }

PS:在free for循环期间,如果使用

 for (i=size; i>=0; i--){...}

而不是增量版本,它实际上会在弹出相同错误之前将m [i]释放为2。 mac没有出错。

1 个答案:

答案 0 :(得分:1)

您正在收到分段违规,因为当您的程序尝试free()堆上已分配的所有内存时,glibc会发现内存已经无可救药地损坏。

您的示例中唯一可能发生损坏的部分是您忽略在示例中包含的部分。

因此,答案是错误是“// ...做一些工作”。如果删除所有代码,则示例将在不崩溃的情况下运行。