2017-01-29 1 views
-3

J'écris des opérations de pile simples avec ma structure de données étant un tableau.Utilisation de realloc() sur une pile

#define DEFAULT_VAL 10  //in a separate Header file 
int *stacky = (int*) malloc (default_size * sizeof(int)); 

L'objectif est d'écrire une fonction pour définir dynamiquement la taille de la pile tout en veillant à ce que les éléments ne sont pas perdus.

Voici ce que j'ai jusqu'à présent:

void Sizer(int size) 
{ 
    #undef DEFAULT_VAL 
    #define DEFAULT_VAL size 
    maxSize = size; 
    int *newbuffer = (int*) realloc (stacky, size); 
    if(newbuffer == NULL) //checking if the 'realloc' was successful :) 
    { 
     printf("PROBLEM HERE :)");    
    } 
    else 
    { 
     stacky = newbuffer;  
    } 
} 

Dans ma fonction main():

int main() 
{ 
    int i; 
    for(i=1; i<15; i++) 
    { 
    push(i); 
    } 
    Sizer(9); 
    displayStack(); 
    Sizer(17); 
    displayStack(); 
} 

La sortie est:

DEFAULT_VAL is now: 9 
     9. 9 
     8. 8 
     7. 7869816 
     6. 7877384 
     5. 17278 
     4. 385207786 
     3. 3 
     2. 2 
     1. 1 

DEFAULT_VAL is now: 17 
     9. 9 
     8. 8 
     7. 7869816 
     6. 7877384 
     5. 17278 
     4. 50331651 
     3. 3 
     2. 2 
     1. 1 

Tout conseil est apprécié! Merci

+0

Vous ne pouvez pas utiliser '# define' de la façon dont vous essayez de les utiliser (en tant que variables). – tkausl

+0

La définition de 'stacky' n'est pas claire à 100%, mais en C, vous ne pouvez pas écrire un initialiseur comme celui affiché lorsque la variable est en dehors d'une fonction. –

+1

Notez que dans le code 'vide Sizer (int size) {/ * * newline/ #undef DEFAULT_VAL/* * newline/ #define DEFAULT_VAL taille/* * newline/ maxSize = taille;', vous ne utilise en fait 'DEFAULT_VAL'. La définition de 'size' est étrange. N'oubliez pas que le préprocesseur effectue une substitution de texte lors de la compilation. Le code pourrait fonctionner - mais utiliser le préprocesseur pour faire ce que vous essayez de faire est pervers, d'autant plus que la macro n'est pas réellement utilisée. –

Répondre

2

De la page man:

La fonction realloc() modifie la taille du bloc de mémoire pointé par ptr à la taille octets.

Ainsi, au lieu de:

int *newbuffer = (int*) realloc (stacky, size); 

vous voulez probablement

int *newbuffer = (int*) realloc (stacky, size * sizeof(int)); 

BTW: Pas besoin de casting lors de l'utilisation malloc et les amis. Voir Do I cast the result of malloc?

+0

Appréciez-le! Après avoir supprimé la distribution, j'obtiens l'erreur - conversion non valide de 'void *' à 'int *'. – Arjun

+0

@Arjun - Cela semble étrange avec 'conversion invalide' - utilisez-vous un compilateur C++ au lieu du compilateur c? – 4386427

+0

J'utilise Dev-C++! – Arjun