Выделение массива строк - PullRequest
0 голосов
/ 28 мая 2019

Я пытаюсь создать массив для хранения нескольких строк. Максимальный размер строки - 100.

Вот как выглядит моя структура:

typedef struct
{
  int size;

  int capacity;

  char** elements;

} array_strings;

Я выделяю место для пустого массива в следующей функции:

array_strings *array_strings_new()
{
    array_strings *vec;

    vec = (array_strings *)malloc(sizeof(array_strings));
    if (vec == NULL)
        return NULL;

    vec->size = 0;
    vec->capacity = 0;
    vec->elements = NULL;

    return vec;
}

А потом я пытаюсь вставить элементы в конец вектора с помощью следующей функции:

int array_strings_insert(array_strings *vec, char *string, int pos)
{
    int i;

    if (vec == NULL || pos < -1 || pos > vec->size)
        return -1;

    /* increases capacity if needed */
    if (vec->size == vec->capacity)
    {
        if (vec->capacity == 0)
            vec->capacity = 1;
        else
            vec->capacity *= 2;


vec->elements = (char **)realloc(vec->elements, vec->capacity *sizeof(char *));
        for (int i = 0; i < vec->capacity; i++)
        {
            vec->elements[i] = realloc(vec->elements[i], 100*sizeof(char));
        }
        if (vec->elementos == NULL)
            return -1;
    }

    /* if pos=-1 inserts at the end of the array */
    if (pos == -1)
        pos = vec->size;

    /* Copy elements from pos to pos+1 until the end of the array */
    for (i = vec->size - 1; i >= pos; i--)
    {
        strcpy(vec->elements[i + 1], vec->elements[i]);
    }

    /* copy string */
    strcpy(vec->elements[pos], string);

    vec->size++;

    return pos;
}

Когда я пытаюсь вставить строку, я получаю "realloc (): неверный указатель Прервано (ядро сброшено) ".

Может кто-нибудь сказать мне, что я делаю не так?

Спасибо,


Я пытался сделать это:

vec->elements = (char **)realloc(vec->elements, vec->capacity *sizeof(char *));
        for (int i = 0; i < vec->capacity; i++)
        {
            vec->elements[i] = NULL; 
            vec->elements[i] = realloc(vec->elements[i], 100*sizeof(char));
        }
        if (vec->elementos == NULL)
            return -1;
    }

И я больше не получаю "realloc (): неверный указатель прерван (ядро сброшено)". Однако первые элементы массива по какой-то причине пусты.

1 Ответ

0 голосов
/ 28 мая 2019

Код realloc, который вы написали, уничтожит ранее сохраненные строки.например, в случае увеличения размера данных с 2 до 4, первые 2 строки будут потеряны.

Вы можете изменить часть realloc следующим образом.

int prevcapacity;
if (vec->size == vec->capacity)
{
    prevcapacity = vec->capacity;    
    if (vec->capacity == 0)
        vec->capacity = 1;
    else
        vec->capacity *= 2;

    vec->elements = (char **)realloc(vec->elements, vec->capacity *sizeof(char *));
    for (int i = prevcapacity; i < vec->capacity; i++)
    {
        vec->elements[i] = malloc(vec->elements[i], 100*sizeof(char));
    }
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...