Попытка использовать realloc (), выгрузка ядра

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

У меня есть функция под названием «inputArray» (в convert.c), которая получает указатель на char (который изначально равен NULL, объявлен в main.c), а затем перераспределяется с помощью одного символа, пока getchar () не получит '\ n 'char. кажется, что функции работают нормально, но затем, когда я пытаюсь напечатать строку обратно в 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);

person fishamit    schedule 07.12.2016    source источник
comment
Найдите и прочтите о эмуляции передачи по ссылке в c.   -  person Some programmer dude    schedule 07.12.2016
comment
sizeof(char) всегда будет 1 ..... (ну, возможно, 2, если вы используете символы двойной ширины, но это фиксированный размер, а это не то, что вам нужно).   -  person gilez    schedule 07.12.2016


Ответы (2)


Размер нового выделенного массива неверен. Вы должны выделить 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);

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

person Vlad from Moscow    schedule 07.12.2016

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

void inputArray(char **array)

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

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

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

 inputArray(&string);
person Abhinav Upadhyay    schedule 07.12.2016
comment
@BeyelerStudios Упс, результат спешки :-) - person Abhinav Upadhyay; 07.12.2016
comment
@BeyelerStudios Спасибо :-) - person Abhinav Upadhyay; 07.12.2016