2016-12-07 3 views
2

J'essaye d'écrire un petit programme qui utilise realloc(), getchar() et une certaine arithmétique de pointeur pour stocker un tableau de caractères dans la mémoire.Tentative d'utilisation de realloc(), obtention du core

J'ai une fonction appelée "inputArray" (dans convert.c) qui reçoit un pointeur vers un char (qui est d'abord NULL, déclaré dans main.c), puis est réattribué avec un caractère jusqu'à getchar() obtient un caractère '\ n' les fonctions semblent fonctionner correctement, mais lorsque j'essaie d'imprimer la chaîne dans main.c, j'obtiens une erreur "segmentation fault (core dumped)". J'ai cherché pendant des heures, ne peux pas trouver où le problème est. Merci!

main.c:

# include "convert.h" 

int main() 
{ 
    char * string = NULL; 
    inputArray(string); 
    printf("%s", string);  
    free(string); 
    return 0; 
} 

convert.c:

#include "convert.h" 

void inputArray(char * array) 
{ 
    /*pointer to the array*/ 
    char * ptr = NULL; 

    /*stores the char*/ 
    char c = 0; 

    /*counter used for pointer arithmetic*/ 
    int count = 0; 

    /*loop for getting chars in array*/ 
    while ((c = getchar()) != '\n') 
    { 
     array = realloc(array, sizeof(char)); 
     ptr = array + count; 
     *ptr = c; 
     ++count; 
    } 

    /*add the null char to the end of the string*/ 
    array = realloc(array, sizeof(char)); 
    ptr += count; 
    *ptr = '\0'; 
} 

CONVERT.H:

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

void inputArray(char * array); 
+4

Recherchez et lisez à propos de * émulant le passage par référence dans c *. –

+0

'sizeof (char)' sera toujours 1 ..... (bien, peut-être 2 si vous utilisez des caractères double largeur - mais c'est une taille fixe, ce qui n'est pas ce que vous voulez). – gilez

Répondre

3

La taille du nouveau tableau alloué est incorrecte. Vous devez allouer count + 1 caractères. Tenez compte du fait qu'il est plus sûr d'utiliser un pointeur temporaire pour réaffecter la mémoire en toute sécurité. Sinon, l'adresse d'origine de la mémoire précédemment allouée sera perdue.

ces déclarations

array = realloc(array, sizeof(char)); 
ptr += count; 

ont tort. Vous devriez au moins écrire

array = realloc(array, count * sizeof(char)); 
ptr = array + count - 1; 

également la fonction doit être déclarée comme

char * inputArray(char * array); 

et il doit retourner le nouveau pointeur vers l'appelant.

Et principal, vous devez écrire

string = inputArray(string); 

Sinon, la fonction doit accepter l'argument par référence est le paramètre doit être déclarée comme

void inputArray(char ** array); 

et être traité en conséquence dans la fonction.

2

Il vous manque un niveau d'indirection dans la fonction inputArray. Il devrait être déclaré comme

void inputArray(char **array) 

et il devrait être realloc'd comme celui-ci (vous devez également augmenter la taille du tableau en multipliant avec count + 1)

*array = realloc(*array, (count + 1) * sizeof(char)); 

Appelez comme ceci:

inputArray(&string); 
+0

@BeyelerStudios Oups, résultat d'une urgence :-) –

+0

@BeyelerStudios Merci :-) –