2016-12-07 7 views
2

Ich versuche, ein kleines Programm zu schreiben, das realloc(), getchar() und einige Zeigerarithmetik verwendet, um ein Array von Zeichen im Speicher zu speichern.Versuchen, Realloc() zu verwenden, Core-Dump

Ich habe eine Funktion namens "inputArray" (in convert.c), die einen Zeiger auf ein char erhält (was NULL ist, in main.c deklariert), wird dann mit einem char neu zugewiesen bis getchar() erhält ein '\ n' Zeichen. Die Funktionen scheinen in Ordnung zu sein, aber wenn ich dann versuche, die Zeichenfolge zurück in main.c zu drucken, bekomme ich einen Fehler "segmentation fault (core dumped)". Ich habe Stunden gesucht, kann nicht finden, wo das Problem ist. Vielen Dank!

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

Suchen Sie nach und lesen Sie über * emulieren Pass durch Referenz in c *. –

+0

'sizeof (char)' wird immer 1 sein ..... (gut, vielleicht 2, wenn Sie Zeichen doppelter Breite verwenden - aber es ist eine feste Größe, die nicht das ist, was Sie wollen). – gilez

Antwort

3

Die Größe des neuen zugewiesenen Arrays ist falsch. Sie müssen count + 1 Zeichen zuordnen.

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

Berücksichtigen Sie, dass es sicherer ist, einen temporären Zeiger zu verwenden, um den Speicher neu zuzuweisen. Andernfalls wird die ursprüngliche Adresse des zuvor zugewiesenen Speichers verloren gehen.

Auch diese Aussagen

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

falsch sind. Sie sollten mindestens schreiben

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

Auch sollte die Funktion wie

char * inputArray(char * array); 

deklariert werden und es muss den neuen Zeiger auf den Anrufer zurückzukehren.

Und in Haupt haben Sie

string = inputArray(string); 

Ansonsten ist die Funktion zu schreiben, sollte das Argument durch Verweis akzeptieren, dass der Parameter sollte wie

void inputArray(char ** array); 

und verarbeitet werden entsprechend in der Funktion deklariert werden.

2

Ihnen fehlt ein Dereferenzierungsebene in der inputArray Funktion. Es sollte wie

void inputArray(char **array) 

deklariert werden und es sollte so realloc'd werden (Sie müssen auch durch Multiplikation mit count + 1 die Größe des Arrays erhöhen)

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

es wie folgt aufrufen:

inputArray(&string); 
+0

@BeyelerStudios Ups, Ergebnis einer Eile :-) –

+0

@BeyelerStudios Danke :-) –