2009-06-04 5 views
1

Je semble obtenir un vidage de pile dans ma fonction où j'alloue de la mémoire.pile dump en utilisant allocation

Je passe un tableau de 'sortie' de pointeurs à ma fonction. Et puis j'attribue assez de mémoire pour assigner dans cette mémoire une chaîne. Cependant, je reçois une décharge de pile.

Un grand merci pour toutes les suggestions,

void display_names(char **names_to_display, char **output); 

int main(void) 
{ 
    char *names[] = {"Luke", "John", "Peter", 0}; 
    char **my_names = names; 
    char **new_output = 0; 

    while(*my_names) 
    { 
     printf("Name: %s\n", *my_names++); 
    } 

    my_names = names; /* Reset */ 
    display_names(my_names, new_output); 

    // Display new output 
    while(*new_output) 
    { 
     printf("Full names: %s\n", *new_output++); 
    } 

    getchar(); 

    return 0; 
} 

void display_names(char **names_to_display, char **output) 
{ 
    while(*names_to_display) 
    { 
     // Stack dump here 
     *output = (char*) malloc(sizeof("FullName: ") + strlen(*names_to_display)); // Allocate memory 

     // Copy new output 
     sprintf(*output, "FullName: %s", *names_to_display++); 
     printf("display_names(): Name: %s\n", *output++); 
    } 
} 

======================== Mis à jour ======== ================

void display_names(char **names_to_display, char **output); 

int main(void) 
{ 
    char *names[] = {"Luke", "John", "Peter", 0}; 
    char **my_names = names; 
    char *new_output[] = {0}; 
    size_t i = 0; 

    while(*my_names) 
    { 
     printf("Name: %s\n", *my_names++); 
    } 

    my_names = names; /* Reset */ 
    display_names(my_names, new_output); 

    // Stack dump here. 
    while(*new_output[i]) 
    { 
     printf("Full names: %s\n", *new_output[i]); 
     i++; 
    } 

    getchar(); 

    return 0; 
} 

void display_names(char **names_to_display, char **output) 
{ 
    while(*names_to_display) 
    { 
     *output = malloc(strlen("FullName: ") + strlen(*names_to_display) + 1); // Allocate memory 

     // Copy new output 
     sprintf(*output, "FullName: %s", *names_to_display++); 
     printf("display_names(): Name: %s\n", *output++); 
    } 
} 
+0

En C, ne jamais afficher la valeur de retour de malloc(). Ce n'est pas nécessaire (malloc() renvoie void *, qui convertit correctement en un autre type de pointeur, par définition), et peut cacher des erreurs si vous avez oublié un fichier d'en-tête. – unwind

Répondre

4

vous avez de nombreuses erreurs, mais le principal est que vous passez le pointeur Anull à display_names:

char **new_output = 0; // null pointer 
... 
display_names(my_names, new_output); 

display_names puis déréférence:

*output = (char*) malloc(sizeof("FullName: ") 
      + strlen(*names_to_display)); // Allocate memory 

résultant en la creash.

En outre, l'allocation ci-dessus n'est pas assez importante - vous voulez ajouter 1 pour le marqueur de fin de chaîne, et vous ne semblez jamais initialiser la mémoire allouée. En outre, c'est une mauvaise habitude d'utiliser sizeof sur les chaînes de caractères - cela fonctionnera dans cette instance, mais vous devriez toujours utiliser strlen.

+0

Bonjour. J'ai mis à jour ma réponse. Cependant, je n'obtiens aucun vidage de pile allouant la mémoire. Cependant, quand je reviens de la fonction, je récupère ma pile. J'ai déclaré ma sortie de ** sortie à * sortie []. Je ne suis pas sûr, mais sont tous les deux la même chose? Merci beaucoup. – ant2009

+0

Oui, les deux sont effectivement la même chose. Vous devez lui donner une taille: - quelque chose comme char * output [OUTSIZE] où OUTSIZE est défini comme étant la taille du tableau - faites-en quelque chose de gros, comme 1024, au moins pour commencer. –

1

Vous ne pouvez pas évaluer * Sortie parce que vous avez passé sur une sortie = null (dans la principale, ******* newoutput = 0 *).

Vous pouvez le réparer en testant le nombre de chaînes que vous avez et le plus grand strlen d'entre eux et commencer par allouer le bloc à sortie, avant d'entrer dans votre boucle sprintf.

En commentaire, où libérez-vous ce morceau? Ne répondez pas "mais je pars juste après" ...