2017-01-26 1 views
1

J'ai besoin de réaffecter un tableau int de dimension initiale 5 avec N valeurs et les remplir avec la somme des valeurs précédentes. Tout fonctionne bien si N = 6 < mais si je mets N == 7, plantage du programme avec cette erreur:Comportement étrange de realloc avec certaines valeurs

a.out: malloc.c:2403: sysmalloc: Assertion `(old_top == initial_top (av) && old_size == 0) || ((unsigned long) (old_size) >= MINSIZE && prev_inuse (old_top) && ((unsigned long) old_end & (pagesize - 1)) == 0)' failed.

Je ne rien de spécial ou étrange, et je ne sais pas pourquoi j'ai ce comportement. Voici mon code:

#include <stdlib.h> 
#include <stdio.h> 
#include <string.h> 


int * change(int * arr, int n) 
{ 
    int * a, i, somma = 0; 

    a = realloc(arr, n * sizeof(int)); 

    for(i = 0; i < 5; i++) 
    somma += arr[i]; 

    for(int j = i; j < (5+n); j++) { 
    a[j] = somma; 
    somma += a[j]; 
    } 

    return a; 
} 

int main() 
{ 
    int N, i, *arr, *arr1; 

    arr = malloc(5 * sizeof(int)); 

    printf("give me 5 numbers\n"); 
    for(i = 0; i < 5; i++) 
    scanf("%d", &arr[i]); 

    printf("give me N number to use in realloc\n"); 
    scanf("%d", &N); 

    arr1 = change(arr, N); 

    for(i = 0; i < (5+N); i++) { 
    printf("%d\n", arr1[i]); 
    } 

    return 0; 
} 

Je Realloc dans un autre pointeur pour éviter problème. L'aide est extrêmement utile. Merci

+0

Compilez avec toutes les informations d'avertissement et de débogage (par exemple 'gcc -Wall -g' si vous utilisez [GCC] (http://gcc.gnu.org/) ...). Améliorez votre code pour ne recevoir aucun avertissement. Ensuite, utilisez le débogueur (par exemple 'gdb' ....) et [valgrind] (http://valgrind.org/). –

+0

J'utilise 'clang -O0 -Wall -g' et la compilation fonctionne bien. J'ai également utilisé le débogueur pour comprendre le comportement – Kyrol

+3

Note: les fonctions 'malloc & co.' peuvent échouer: vérifier les valeurs retournées ** toujours ** – LPs

Répondre

7

Voici un problème:

a = realloc(arr, n * sizeof(int)); 

for(i = 0; i < 5; i++) 
    somma += arr[i]; 

La fonction realloc annule l'argument passé, arr. Il provoque par la suite arr comportement non défini, comme vous le faites en écrivant arr[i].

Pour résoudre ce problème, vous pouvez déplacer la somme avant la ligne realloc.


Un autre problème est que la boucle suivante écrit hors limites:

for(int j = i; j < (5+n); j++) { 
    a[j] = somma; 

Vous seul espace alloué pour n entrées mais vous en boucle jusqu'à 5+n. (Et dans main vous bouclez jusqu'à 5+N aussi). Peut-être que vous devriez réallouer (5+n) entrées à la place.

+0

Merci pour l'aide – Kyrol

4

Après réaffectés arr ici

a = realloc(arr, n * sizeof(int)); 

vous ne pouvez pas l'utiliser plus comme ici:

for(i = 0; i < 5; i++) 
    somma += arr[i]; 

mais il suffit d'utiliser à la place a,

2

Vous appelez realloc d'allouer n entier éléments dans votre tableau. Ensuite, vous bouclez n + 5. Même dans la fonction main, vous bouclez sur les éléments N + 5, lorsque la nouvelle matrice contient uniquement N éléments.

Cela conduit bien sûr à undefined comportement que vous sortez des limites.