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

标签 c linux macos pointers

我有以下 C 程序,它分配一个二维数组,并在空闲部分报告

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

带有回溯。

我在 Linux 服务器上尝试了相同的代码并得到了相同的错误。然而,相同的代码在我 friend 的 Mac 上运行得很好。

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

# 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 没有出现任何问题。

最佳答案

您遇到了分段冲突,因为当您的程序尝试free()堆上分配的所有内存时,glibc 发现内存已被无可救药地损坏。

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

因此,答案是该错误是“//... Do some work”。如果删除所有这些代码,您的示例将运行而不会崩溃。

关于Linux 上的 C free() 报告无效的下一个大小错误、数组指针、Mac 上的相同代码传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26208030/

相关文章:

c - 小段代码出现段错误(核心转储)错误

c - 使用 epoll 的多线程 UDP 服务器?

linux - MV : cannot stat 'coverage.txt' : No such file or directory

c# - Linux Mono + Postsharp + Log4Net = 没有自动异常捕获

c - 强制 mac 使用 GCC,而不是 clang

c - 如何在C编程中使用指针编写乘法矩阵

c - 在 unix 上读取文件时如何解决退出代码 139 错误

python - 使用 Python 结构模块解压 C 结构

macOS 上的 Objective-C - 获取 keyDown : for Shift+Tab in NSView

macos - mac下如何切换maven版本