C strukturalar va xotira


ULASHISH

Strukturalar va dinamik xotira

Dinamik xotiradan strukturalar bilan birga ham foydalanishingiz mumkin.

Bu qancha struktura kerak bo‘lishini oldindan bilmaganingizda yoki faqat kerakli miqdorda xotira ajratib, xotirani tejamoqchi bo‘lganingizda foydali (masalan, avtomobillar soni aniq bo‘lmagan avtosalon dasturida).


Struktura uchun xotira ajratish

Struktura ko‘rsatkichi uchun xotira ajratishda malloc() funksiyasidan foydalanishingiz mumkin:

Misol

#include <stdio.h>
#include <stdlib.h>
#include <string.h> 

struct Car {
  char brand[50];
  int year;
};

int main() {
  // Allocate memory for one Car struct
  struct Car *ptr = (struct Car*) malloc(sizeof(struct Car));

  // Check if allocation was successful
  if (ptr == NULL) {
    printf("Memory allocation failed.\n");
    return 1; // Exit the program with an error code
  }

  // Set values
  strcpy(ptr->brand, "Honda");
  ptr->year = 2022;

  // Print values
  printf("Brand: %s\n", ptr->brand);
  printf("Year: %d\n", ptr->year);

  // Free memory
  free(ptr);

  return 0;
}

O‘zingiz sinab ko‘ring »

Misol izohi

  • malloc() bitta struktura uchun xotira ajratadi
  • strcpy() brand maydoniga stringni nusxalash uchun ishlatiladi
  • Ko‘rsatkich orqali a’zolarga murojaat qilish uchun -> operatoridan foydalanamiz
  • Oxirida xotirani bo‘shatish uchun free() ishlatiladi

Eslatma: malloc() initsializatsiya qilinmagan xotira ajratadi. Qiymat bermaguningizcha uning tarkibi noaniq bo‘ladi. Agar xotira nol bilan initsializatsiya qilinishini istasangiz, calloc() funksiyasidan foydalanishingiz mumkin.



Strukturalar massividan foydalanish

Bir nechta struktura uchun xotirani massiv kabi birdaniga ajratishingiz ham mumkin:

Misol: 3 ta avtomobil uchun xotira ajratish

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct Car {
  char brand[50];
  int year;
};

int main() {
  struct Car *cars = (struct Car*) malloc(3 * sizeof(struct Car));

  if (cars == NULL) {
    printf("Memory allocation failed.\n");
    return 1 // Exit the program with an error code;
  }

  // Fill the data
  strcpy(cars[0].brand, "Ford");
  cars[0].year = 2015;

  strcpy(cars[1].brand, "BMW");
  cars[1].year = 2018;

  strcpy(cars[2].brand, "Volvo");
  cars[2].year = 2023;

  // Print the data
  for (int i = 0; i < 3; i++) {
    printf("%s - %d\n", cars[i].brand, cars[i].year);
  }

  free(cars);
  return 0;
}

O‘zingiz sinab ko‘ring »


Massivlarni keyinroq realloc() yordamida kattalashtirish

Keyinroq ko‘proq element kerak bo‘lsa, dinamik massivingiz o‘lchamini realloc() yordamida o‘zgartirishingiz mumkin. Bu blokni yangi joyga ko‘chirishi va yangi ko‘rsatkich qaytarishi mumkin. Qayta ajratish muvaffaqiyatsiz bo‘lganda asl xotirani yo‘qotmaslik uchun natijani har doim avval vaqtinchalik ko‘rsatkichda saqlang.

Misol: strukturalar massivini kengaytirish

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct Car {
  char brand[50];
  int year;
};

int main() {
  int count = 2;
  struct Car *cars = (struct Car*) malloc(count * sizeof(struct Car));
  if (cars == NULL) {
    printf("Initial allocation failed.\n");
    return 1;
  }

  // Initialize first 2 cars
  strcpy(cars[0].brand, "Toyota"); cars[0].year = 2010;
  strcpy(cars[1].brand, "Audi");   cars[1].year = 2019;

  // Need one more car -> grow to 3
  int newCount = 3;
  struct Car *tmp = (struct Car*) realloc(cars, newCount * sizeof(struct Car));
  if (tmp == NULL) {
    // 'cars' is still valid here; free it to avoid a leak
    free(cars);
    printf("Reallocation failed.\n");
    return 1;
  }
  cars = tmp;  // use the reallocated block

  // Initialize the new element at index 2
  strcpy(cars[2].brand, "Kia"); 
  cars[2].year = 2022;

  // Print all cars
  for (int i = 0; i < newCount; i++) {
    printf("%s - %d\n", cars[i].brand, cars[i].year);
  }

  free(cars);
  return 0;
}

O‘zingiz sinab ko‘ring »

Eslatma: realloc() qo‘shgan yangi joy initsializatsiya qilinmagan bo‘ladi. Yangi qo‘shilgan elementlardan foydalanishdan oldin ularni albatta initsializatsiya qiling (masalan, strcpy(cars[2].brand, "Kia"); cars[2].year = 2022;).


W3Schools Pathfinder

Yutuqlaringizni kuzating – bu bepul!