Как выделить память под массив структур? - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Привет всем! Помогите, не знаю как выделить память под массив структур.
#include <conio.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
 
/*1) створіть структуру Club з полями: name - назва клубу; city - місто, яке він представляє;
score - кількість набраних очок;*/
 
struct Club
{
    char cCity[255];
    char cName[255];
    char cScore[255];
};
 
int main(void)
{
    struct Club sClub;
    signed int i;
 
    for ( i = 0; i < 255; i++ )
    {
        sClub.cCity[i] = 0;
        sClub.cName[i] = 0;
        sClub.cScore[i] = 0;
    }
 
    /* 2) створіть файл, в якій внесіть дані - майбутні значення полів структури Club
       (кожне поле - з нового рядка, без пробілів!), кількість клубів - не менше 10
       (розташувати у файлі в довільному порядку, не залежно від кількості очок);*/
 
    FILE *pClub;
    pClub = fopen ( "FileAllClubs.txt", "a+" ); //3) збережіть створений файл як текстовий;
 
    printf ( "Input name city: " );
    gets ( sClub.cCity );
    printf ( "Input name club: " );
    gets ( sClub.cName );
    printf ( "Input score club: " );
    gets ( sClub.cScore );
 
    fprintf( pClub, "%s\n%s\n%s\n", &sClub.cCity[0], &sClub.cName[0], &sClub.cScore[0] );
    fclose ( pClub );
 
    for ( i = 0; i < 255; i++)
    {
        sClub.cCity[i] = 0;
        sClub.cName[i] = 0;
        sClub.cScore[i] = 0;
    }
 
    pClub = fopen ( "FileAllClubs.txt", "r+" );
    fgets (sClub.cCity, 255, pClub);
    fgets (sClub.cName, 255, pClub);
    fgets (sClub.cScore, 255, pClub);
    fclose ( pClub );
 
    puts(sClub.cCity);
    puts(sClub.cName);
    puts(sClub.cScore);
 
    /*4) введіть з клавіатури число n - кількість клубів,
    дані про які потрібно прочитати з файлу;*/

    signed int N = 0;
    printf ( "Input N: " );
    scanf ( "%d", &N );
    
    struct Club *p;
    if((p = malloc(sizeof(struct addr))) == NULL) {
        printf("ERROR\n");
        exit(1);
      }

    for ( i = 0; i < N; i++ )
    {
 
    }
    pClub = fopen ( "FileAllClubs.txt", "r+b" );
 
    fclose ( pClub );
 
    //5) виділіть динамічно пам’ять для масиву з n структур;
 
    //6) прочитайте у відповідний масив максимально можливу кількість даних про клуби;
 
    /*
    7) здійснить сортування даного масиву за спаданням кількості очок клубів - першим елементом щоб стала структура, клуб якої має максимальну кількість очок, і далі - в порядку зменшення;
    Примітка: - з метою обміну структур місцями оголосіть додаткову аналогічну структуру, в яку тимчасово будете копіювати ті, що підлягають перестановці;
    •доступ до елементів масиву структур здійснюйте за допомогою покажчиків!
    */
 
    //8) дані відсортованого масиву виведіть до іншого текстового файлу (по можливості використовуючи форматування для кращої читабельності); перевірте файл на предмет правильного порядку розташування в ньому даних про клуби.

   return 0;
}

Решение задачи: «Как выделить память под массив структур?»

textual
Листинг программы
struct Club *aArrayClub;
 
    if ((aArrayClub = (struct Club*) malloc(N * sizeof(struct Club))) == NULL)
    {
        printf("ERROR\n");
        exit(1);
    }
 
    for (i = 0; i < N; i++)
    {
        strcpy(aArrayClub[i].cCity, sClub.cCity);
        strcpy(aArrayClub[i].cName, sClub.cName);
        strcpy(aArrayClub[i].cScore, sClub.cScore);
 
    }

Объяснение кода листинга программы

В данном коде происходит выделение памяти под массив структур типа Club. Структура Club содержит три поля: cCity, cName и cScore, которые являются строками.

  1. Создается указатель на структуру Club, называемый aArrayClub.
  2. С помощью функции malloc() выделяется память под массив структур Club, где N - количество структур.
  3. Если выделение памяти не удалось (получен NULL), то выводится сообщение об ошибке и программа завершается.
  4. Если выделение памяти прошло успешно, то начинается цикл for, который выполняется N раз.
  5. Внутри цикла поля каждой структуры массива aArrayClub заполняются значениями полей структуры sClub.
  6. После завершения цикла все выделенные структуры будут содержать копии полей структуры sClub.

Оцени полезность:

10   голосов , оценка 3.9 из 5
Похожие ответы