C strukturalar va xotira
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;
}
Misol izohi
malloc()bitta struktura uchun xotira ajratadistrcpy()brandmaydoniga 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;
}
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;
}
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!
