2016-12-07 2 views
2

Я пытаюсь написать небольшую программу, которая использует realloc(), getchar() и некоторую арифметику указателя для хранения массива символов в памяти.Попытка использования realloc(), получение ядра сбрасывается

У меня есть функция, называемая «inputArray» (в convert.c), которая получает указатель на char (который начинается с NULL для начала, объявленный в main.c), а затем перераспределяется с одним символом до тех пор, пока getchar() получает символ '\ n'. функции, похоже, работают нормально, но затем, когда я пытаюсь напечатать строку обратно в main.c, я получаю ошибку «segmentation fault (core dumped)». Я искал часы, не могу найти, где проблема. Благодаря!

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

Поиск и чтение про * эмулирующий проход по ссылке в c *. –

+0

'sizeof (char)' всегда будет 1 ..... (ну, возможно, 2, если вы используете символы двойной ширины, но это фиксированный размер, который вам не нужен). – gilez

ответ

3

Размер нового выделенного массива неверен. Вы должны выделить count + 1 символов.

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

Примите во внимание, что более безопасно использовать временный указатель для перераспределения памяти. В противном случае исходный адрес ранее выделенной памяти будет потерян.

Кроме того, эти заявления

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

неверны. Вы должны, по крайней мере, написать

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

Также функция должна быть объявлена ​​как

char * inputArray(char * array); 

и он должен вернуть новый указатель к вызывающему.

И главная вы должны написать

string = inputArray(string); 

В противном случае функция должна принимать аргумент по ссылке, которая является параметр должен быть объявлен как

void inputArray(char ** array); 

и обрабатываются соответственно в функции.

2

У вас не хватает на один уровень косвенности в функции inputArray. Он должен быть объявлен как

void inputArray(char **array) 

и это должно быть realloc'd как это (вы также должны увеличить размер массива путем умножения с count + 1)

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

Назовите это так:

inputArray(&string); 
+0

@BeyelerStudios К сожалению, результат спешки :-) –

+0

@BeyelerStudios Спасибо :-) –

Смежные вопросы