Я знаю, как создать массив структур, но с предопределенным размером. Однако есть ли способ создать динамический массив структур, чтобы массив мог увеличиваться?
Например:
typedef struct
{
char *str;
} words;
main()
{
words x[100]; // I do not want to use this, I want to dynamic increase the size of the array as data comes in.
}
Возможно ли это?
Я исследовал это: words* array = (words*)malloc(sizeof(words) * 100);
Я хочу избавиться от 100 и сохранять данные по мере их поступления. Таким образом, если поступает 76 полей данных, я хочу хранить 76, а не 100. Я предполагаю, что не знаю, сколько данные поступают в мою программу. В структуре, которую я определил выше, я мог создать первый «индекс» как:
words* array = (words*)malloc(sizeof(words));
Однако я хочу динамически добавлять элементы в массив после. Надеюсь, я достаточно четко описал проблемную область. Основная задача состоит в том, чтобы динамически добавить второе поле, по крайней мере, на данный момент это проблема.
Однако я немного продвинулся:
typedef struct {
char *str;
} words;
// Allocate first string.
words x = (words) malloc(sizeof(words));
x[0].str = "john";
// Allocate second string.
x=(words*) realloc(x, sizeof(words));
x[1].FirstName = "bob";
// printf second string.
printf("%s", x[1].str); --> This is working, it's printing out bob.
free(x); // Free up memory.
printf("%s", x[1].str); --> Not working since its still printing out BOB even though I freed up memory. What is wrong?
Я сделал некоторую проверку ошибок, и это то, что я нашел. Если после освобождения памяти для x я добавлю следующее:
x=NULL;
тогда, если я пытаюсь напечатать x, я получаю сообщение об ошибке, которое я и хочу. Так что, бесплатная функция не работает, по крайней мере, на моем компиляторе? Я использую DevC ??
Спасибо, теперь я понимаю из-за:
FirstName - это указатель на массив char, который не выделяется malloc, только указатель выделяется и после вызова free не стирает память, он просто помечает ее как доступную в куче быть переписано позже. - MattSmith
Обновление
Я пытаюсь модулировать и поместить создание моего массива структур в функцию, но, похоже, ничего не работает. Я пытаюсь что-то очень простое, и я не знаю, что еще делать. Это то же самое, что и раньше, просто еще одна функция, loaddata, которая загружает данные, и вне метода, который мне нужен для печати. Как я могу заставить это работать? Мой код выглядит следующим образом:
# include <stdio.h>
# include <stdlib.h>
# include <string.h>
# include <ctype.h>
typedef struct
{
char *str1;
char *str2;
} words;
void LoadData(words *, int *);
main()
{
words *x;
int num;
LoadData(&x, &num);
printf("%s %s", x[0].str1, x[0].str2);
printf("%s %s", x[1].str1, x[1].str2);
getch();
}//
void LoadData(words *x, int * num)
{
x = (words*) malloc(sizeof(words));
x[0].str1 = "johnnie\0";
x[0].str2 = "krapson\0";
x = (words*) realloc(x, sizeof(words)*2);
x[1].str1 = "bob\0";
x[1].str2 = "marley\0";
*num=*num+1;
}//
Этот простой тестовый код дает сбой, и я понятия не имею, почему. Где ошибка?