C错误:free():无效的下一个大小(快):,OSX,Linux上的C程序的不同行为

这个问题已经被问了好几次了,但是因为我觉得我的情况是我觉得比较具体:

我有一个C程序,在我的OSX系统上完美工作(太大而无法复制)。 我已经用Valgrindtesting过了,而且我没有错过任何frees / mallocs /或写入,所有的问题都解决了100%。

当我现在在外部服务器上通过ssh运行程序时,如果运行的数据不是那么多(参见下面的代码,my_length <1000),它没有任何问题。 但是对于一个较大的数据集,使用Linuxterminal,我得到这个错误:

*** Error in `./a.out': free(): invalid next size (fast): 0x00000000016b9ed0 *** ======= Backtrace: ========= /lib64/libc.so.6[0x3e50475cff] /lib64/libc.so.6[0x3e5047cff8] ./a.out[0x41083c] ./a.out[0x402374] /lib64/libc.so.6(__libc_start_main+0xf5)[0x3e50421d65] ./a.out[0x400e79] ======= Memory map: ======== 00400000-00418000 r-xp 00000000 00:4d 89038 

[…]

当我在Solaris上运行它抱怨:

 malloc failed 

在我分配一个三维数组的地方:

  int ***A, ***B, ***C; A = malloc(sizeof(int**)*2); B = malloc(sizeof(int**)*2); C = malloc(sizeof(int**)*2); int i; for (i = 0; i < 2; i++) { A[i] = malloc(sizeof(int*)* my_length); B[i] = malloc(sizeof(int*)* my_length); C[i] = malloc(sizeof(int*)* my_length); for (j = 0; j <= my_length2; j++) { A[i][j] = malloc(sizeof(int)* my_length2); B[i][j] = malloc(sizeof(int)* my_length2); C[i][j] = malloc(sizeof(int)* my_length2);<== malloc failed here?? } } 

my_lengthmy_length2真的非常巨大!

我越来越绝望了! 有人有任何线索我的问题可能是什么?

有这么多的重复发现这个问题,令人讨厌的是,我找不到合适的你。

基本的问题是你的程序已经写了malloc / free库使用的内存块跟踪信息。

程序中的某个地方是内存写入超出限制。

好吧,我找到了一个可能的解决方案,我逐步增加我的价值,现在valgrind报告如下:

 ==3954== Invalid write of size 8 ==3954== at 0x344C1B: _platform_memmove$VARIANT$Unknown (in /usr/lib/system/libsystem_platform.dylib) ==3954== by 0x1C4D74: __memcpy_chk (in /usr/lib/system/libsystem_c.dylib) ==3954== by 0x10000B2E4: my_method (delete.c:1461) ==3954== by 0x1000025B3: main (delete.c:365) ==3954== Address 0x1020611a0 is 16 bytes after a block of size 2,096 alloc'd ==3954== at 0x56AA: realloc (vg_replace_malloc.c:698) ==3954== by 0x10000B21E: my_method (delete.c:1458) ==3954== by 0x1000025B3: main (delete.c:365) 

这是代码,因为我不知道为什么会出现:S

 if (temp_length + strlen(new_substring) > max_seq_lens[i]) { max_len[i] *= 2; my_array[i].name = realloc(sizeof(char)* max_seq_lens[i]); <=== } temp_length += (some_num); 

所以在这里temp_length保存my_array [i] .name的当前长度,我想连接一个新的字符串(new_substring),并在连接它们之前,我试图检查内存是否足够,我真的看不到我的错误在这里:S