Массив C структур - PullRequest
       16

Массив C структур

1 голос
/ 05 февраля 2011

Если я создаю структуру в C и хочу добавить ее в массив, для которого не установлен фиксированный размер, как создается массив?

Можно ли создать tempStruct, который будет использоваться на каждой итерации при получении пользовательского ввода, и сохранить его в массиве, всегда используя одну и ту же структуру tempStruct в цикле?

Как создается массив, если размер неизвестен, так как он зависит от пользовательского ввода, и как структуры добавляются в этот массив?

Ответы [ 4 ]

0 голосов
/ 05 февраля 2011

Если вы используете старый стандартный компилятор C89, вы не можете использовать массивы переменной длины.Если вы используете C99, то вы можете создать массив переменной длины.Для пояснения: переменная длина не означает, что длина массива может измениться во время выполнения.Это просто означает, что вы можете установить его во время выполнения вместо фиксации значения во время компиляции.

Например, например:

CreateArray(const int numberOfElements)
{
       struct MyStruct arrayOfStructs[numberOfElements];
}

Это действительно в C99, но не в C89.Проверьте документацию вашего компилятора.

0 голосов
/ 05 февраля 2011

Когда размер неизвестен во время компиляции, вам нужно выделить память в куче, а не в сегменте данных (где хранятся глобальные переменные) или в стеке (где хранятся параметры функции и локальные переменные ). В C вы можете сделать это, вызвав такие функции, как malloc.

MyStructType *myArray = (MyStructType *)malloc(numElements * sizeof(MyStructType)
... do something ...
free(myArray)

Если вы используете C ++, обычно лучше использовать new [] и delete [], например,

MyStructType *myArray = new MyStructType[numElements]
... do something ...
delete [] myArray

Обратите внимание, что new [] должен быть в паре с delete []. Если вы выделяете один экземпляр, используйте new и delete (без «[]»). delete [] и delete не эквивалентны.

Кроме того, если вы используете C ++, обычно проще и безопаснее использовать вектор STL.

0 голосов
/ 05 февраля 2011

массив C должен быть с фиксированным размером, это то, что мы узнали много лет назад но функции выделения памяти могут помочь вам найти решение

в c ++ вы можете использовать оператор new

int num=0;
cout<<"please enter the number"<<endl;
cin>>num;
int *x=new int[num];
for(int i=0;i<num;i++)
{
   cout<<"enter element "<<(i+1)<<endl;
   cin>>x[i];
}
//do your work

и как

Мистер Фуз

упомянутое удаление [] используется для освобождения памяти, выделенной новым [] и это общий пример

0 голосов
/ 05 февраля 2011

Да, вы можете использовать tempStruct во время ввода, который вы позже добавите в массив.

Если размер массива неизвестен, значит, у вас проблемы.Вы должны где-то отслеживать размер массива.Просто имейте целочисленную переменную, которую вы изменяете каждый раз, когда изменяете свой массив, чтобы отслеживать размер вашего массива.

Если размер структуры неизвестен во время компиляции, это еще сложнее.Вы либо просто сохраняете указатели в массиве, которые указывают на ваши фактические элементы структуры в памяти, либо вы должны отслеживать размеры каждой структуры в массиве.В последнем случае вам придется выполнять адресацию в массиве полностью вручную, рассчитывая много.Хотя это очень эффективно использует память, оно также подвержено ошибкам и чрезвычайно сложно для отладки.

ОК.Пример создания массива, в котором хранится ваша структура с использованием указателей:

struct MyStruct
{
  /* code */
}

main()
{
  counter = 0;
  struct MyStruct** array = malloc(counter);
  // Create new Element
  struct MyStruct myElement;
  myElement.someData = someValue;

  // Add element to array:
  array = realloc(array, sizeof(struct MyStruct*) * (counter + 1);
  array[counter] = &myElement;
  counter++;

  // Create yet another new Element
  struct MyStruct myElement;
  myElement.someData = someOtherValue;
  array = realloc(array, sizeof(struct MyStruct*) * (counter + 1);
  array[counter] = &myElement;
  counter++;

  // Now remove the last element
  free(array[counter -1]); // may have something more complicated than that, depending on your struct
  array = realloc(array, sizeof(struct MyStruct*) * (counter - 1);
  counter--;
}

этот код не тестировался!

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