Erreur C: free (): prochaine taille non valide (rapide) :, comportement différent du programme C sous OSX, Linux

Cette question a été posée à plusieurs resockets, mais puisque je pense que ma situation est plus spécifique, je pense:

J’ai un programme C, qui fonctionne parfaitement sur mon système OSX (trop énorme pour être copié). Je l’ai déjà testé avec Valgrind, et il ne me manque aucun free / mallocs / or write, tous les problèmes sont résolus à 100%.

Lorsque je lance maintenant le programme sur ssh sur un serveur externe, lorsque je lance avec peu de données (voir le code ci-dessous, my_length <1000), cela fonctionne sans problème. Mais avec un plus grand ensemble de données, en utilisant le terminal Linux, j'obtiens cette erreur:

*** 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 

[…]

et quand je l’exécute sur Solaris, il se plaint:

 malloc failed 

à une ligne où j’alloue un tableau à trois dimensions:

  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_length et my_length2 deviennent vraiment énormes!

Je commence à être désespéré! Est-ce que quelqu’un a la moindre idée de ce que mon problème pourrait être?

Il y a tellement de doublons trouvés pour cette question que, ennuyeusement, je ne trouve pas le bon pour vous.

Le problème fondamental est que votre programme a très certainement écrit sur les informations de suivi de bloc de mémoire utilisées par la bibliothèque malloc / free.

Quelque part dans votre programme se trouve une écriture en mémoire qui est hors limites.

Ok, j’ai trouvé une solution possible, j’augmentais mes valeurs progressivement, et maintenant, valgrind rapporte:

 ==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) 

Et ceci est le code, parce que je ne sais pas pourquoi cela apparaît: S

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

SO ici temp_length enregistre la longueur actuelle de mon my_array [i] .name, j'essaie de concaténer une nouvelle chaîne (new_subssortingng) et avant de les concaténer, j'ai essayé de vérifier si la mémoire est suffisante, je ne vois vraiment pas mon erreur ici: S