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

C错误:free():无效的下一个大小(fast):,OSX、Linux上C程序的不同行为,c,linux,macos,C,Linux,Macos,这个问题已经被问过好几次了,但我认为我的情况更为具体: 我有一个C程序,它在我的OSX系统上运行得很好(太大了,无法复制)。我已经用Valgrind对它进行了测试,我没有遗漏任何空闲/mallocs/或写入,所有问题都100%解决了 现在,当我在外部服务器上通过ssh运行程序时,当我在没有那么多数据的情况下运行时(请参阅下面的代码,我的_长度最大镜头(镜头[i]){ 最大长度[i]*=2; my_array[i].name=realloc(sizeof(char)*max_seq_lens[i]

这个问题已经被问过好几次了,但我认为我的情况更为具体:

我有一个C程序,它在我的OSX系统上运行得很好(太大了,无法复制)。我已经用Valgrind对它进行了测试,我没有遗漏任何空闲/mallocs/或写入,所有问题都100%解决了

现在,当我在外部服务器上通过ssh运行程序时,当我在没有那么多数据的情况下运行时(请参阅下面的代码,我的_长度<1000),它可以正常工作。但对于较大的数据集,使用Linux终端,我会出现以下错误:

 *** 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??
    }   
}
int***A、***B、***C;
A=malloc(sizeof(int**)*2);B=malloc(sizeof(int**)*2);C=malloc(sizeof(int**)*2);
int i;
对于(i=0;i<2;i++){
A[i]=malloc(sizeof(int*)*my_长度);
B[i]=malloc(sizeof(int*)*myu长度);
C[i]=malloc(sizeof(int*)*myu长度);

对于(j=0;j这个问题,有太多的重复项,令人烦恼的是,我找不到适合你的

基本的问题是,您的程序肯定写入了malloc/free库使用的内存块跟踪信息


程序中的某个地方有一个超出范围的内存写入。

对于这个问题,找到了太多重复项,令人烦恼的是,我找不到适合您的

基本的问题是,您的程序肯定写入了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);
if(临时长度+strlen(新子字符串)
>最大镜头(镜头[i]){
最大长度[i]*=2;

my_array[i].name=realloc(sizeof(char)*max_seq_lens[i]);好的,我找到了一个可能的解决方案,我正在逐步增加我的值,现在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);
if(临时长度+strlen(新子字符串)
>最大镜头(镜头[i]){
最大长度[i]*=2;


my_数组[i].name=realloc(大小(字符)*最大顺序镜头[i])是的,你是对的,但这是一个错误,在我的代码中键入,它是正确的
my_length
my_length 2
的值是什么?你是否试图分配比操作系统允许的内存更多?>大约50000,我认为应该有足够的空间用于此操作。如果我想要,是否应该有错误分配“很多”MemoryGet另一个三开始程序员。YATSP
j是的,你是对的,但这是一个在这里键入的错误,它在我的代码中是正确的
my_length
my_length2
的值是什么?你是否试图分配比操作系统允许的内存更多?>大约50000,我认为应该有足够的空间用于这个。如果我想分配“太多”,是否应该有一个错误MemoryGet另一个三启动程序员。YATSPIt甚至可以是
j的使用。你的意思是,在某个地方我分配到更少的内存,然后我尝试重写它?但是,怎么可能,这个错误只是偶尔发生,不是每次启动程序时都会发生吗?valgrind不应该找到写错误吗?到底发生了什么是未定义的,但可能是实际发生的情况取决于您的计算机的状态,即加载和运行的其他内容等@malajedala:有时malloc分配的内存比您要求的要多。这可以减少碎片并改进内存访问对齐。在这种情况下,您可以写到最后而不会崩溃。在其他情况下例内存分配正是你要求的,没有额外的空间。啊,好吧,是的,你是对的……那么我怎么可能发现这个错误:S?甚至可能是使用
j你的意思是,在某个地方我分配了更少的内存,然后我试着重写它?但是怎么可能,这个错误只是偶尔发生,不是吗每次我启动程序时都会发生什么?valgrind不应该发现写入错误吗?具体发生的情况还没有定义,但可能是实际发生的情况取决于您的机器的状态,即加载和运行的其他内容等@malajedala:有时malloc分配的内存比您要求的要多。这可以减少fragmen它可以提高内存访问的一致性。在这些情况下,您可以写到末尾而不会崩溃。在其他情况下,内存分配正是您所要求的,并且没有额外的空间。啊,好吧,是的,您是对的……那么我怎么可能发现这个错误:S?这不是答案。看看您的代码使用的变量名。我想你使用了错误的数组。剪切粘贴错误?这不是答案。看看你的代码使用的变量名。我认为你使用了错误的数组。剪切粘贴错误?