4.8 KiB
---LESSON_INFO--- Learning Objectives:
- Memahami konsep alokasi memori dinamis dalam bahasa C
- Belajar menggunakan fungsi malloc dan free
- Mengenal penggunaan sizeof dalam alokasi memori
- Memahami pentingnya dealokasi memori
Prerequisites:
- Pemahaman tentang pointer dan struktur
- Pemahaman dasar tentang memori dalam program
---END_LESSON_INFO---
Alokasi Dinamis dalam C
Alokasi memori dinamis adalah subjek yang sangat penting dalam C. Ini memungkinkan pembuatan struktur data kompleks seperti daftar tertaut. Alokasi memori secara dinamis membantu kita menyimpan data tanpa awalnya mengetahui ukuran data pada saat kita menulis program.
Untuk mengalokasikan sepotong memori secara dinamis, kita perlu memiliki pointer siap untuk menyimpan lokasi dari memori yang baru dialokasikan. Kita bisa mengakses memori yang dialokasikan kepada kita menggunakan pointer yang sama, dan kita bisa menggunakan pointer itu untuk membebaskan memori lagi, setelah selesai menggunakannya.
Mari kita asumsikan kita ingin mengalokasikan struktur orang secara dinamis. Orang didefinisikan seperti ini:
typedef struct {
char * name;
int age;
} person;
Untuk mengalokasikan orang baru dalam argumen myperson, kita gunakan sintaks berikut:
person * myperson = (person *) malloc(sizeof(person));
Ini memberi tahu kompiler bahwa kita ingin mengalokasikan secara dinamis cukup untuk menahan struktur person dalam memori dan kemudian mengembalikan pointer tipe person ke data yang baru dialokasikan. Fungsi alokasi memori malloc() memesan ruang memori yang ditentukan. Dalam hal ini, ini adalah ukuran dari person dalam byte.
Alasan kita menulis (person *) sebelum panggilan ke malloc() adalah karena malloc() mengembalikan "pointer void," yang merupakan pointer yang tidak memiliki tipe. Menulis (person *) di depannya disebut typecasting, dan mengubah tipe dari pointer yang dikembalikan dari malloc() menjadi person. Namun, ini tidak wajib ditulis seperti ini karena C akan secara implisit mengonversi tipe dari pointer yang dikembalikan ke tipe dari pointer yang ditetapkan ke (dalam hal ini, myperson) jika Anda tidak mengetiknya.
Perhatikan bahwa sizeof bukan fungsi sebenarnya, karena kompiler menafsirkan dan menerjemahkannya ke ukuran memori sebenarnya dari struktur person.
Untuk mengakses anggota orang, kita bisa menggunakan notasi ->:
myperson->name = "John";
myperson->age = 27;
Setelah selesai menggunakan struktur yang dialokasikan secara dinamis, kita bisa melepaskannya menggunakan free:
free(myperson);
Perhatikan bahwa free tidak menghapus variabel myperson itu sendiri, itu hanya melepaskan data yang ditunjuknya. Variabel myperson akan tetap menunjuk ke suatu tempat di memori - tetapi setelah memanggil free(myperson) kita tidak diizinkan mengakses area itu lagi. Kita tidak boleh menggunakan pointer itu lagi sampai kita mengalokasikan data baru menggunakannya.
Tabel Fungsi Alokasi Memori dalam C
| Fungsi | Deskripsi | Contoh |
|---|---|---|
| malloc() | Mengalokasikan blok memori | malloc(size) |
| calloc() | Mengalokasikan dan menginisialisasi ke nol | calloc(num, size) |
| realloc() | Mengubah ukuran blok memori yang dialokasikan | realloc(ptr, new_size) |
| free() | Melepaskan blok memori yang dialokasikan | free(ptr) |
| sizeof() | Mendapatkan ukuran tipe data atau variabel | sizeof(int) |
---EXERCISE---
Latihan: Alokasi Dinamis untuk Struktur Titik
Gunakan malloc untuk mengalokasikan struktur titik secara dinamis.
Requirements:
- Gunakan malloc untuk mengalokasikan memori untuk struktur point
- Akses anggota x dan y menggunakan operator arrow
- Jangan lupa untuk membebaskan memori setelah digunakan
Expected Output:
mypoint coordinates: 10, 5
Try writing your solution in the code editor below!
---KEY_TEXT--- malloc sizeof free (point *) ---END_KEY_TEXT---
---EXPECTED_OUTPUT--- mypoint coordinates: 10, 5 ---END_EXPECTED_OUTPUT---
---INITIAL_CODE--- #include <stdio.h> #include <stdlib.h>
typedef struct {
int x;
int y;
} point;
int main() {
point * mypoint = NULL;
/* Alokasikan secara dinamis struktur titik baru yang ditunjuk oleh mypoint di sini */
mypoint->x = 10;
mypoint->y =5 ;
printf("mypoint coordinates: %d, %d\\n", mypoint->x, mypoint->y);
free(mypoint);
return 0;
}
---END_INITIAL_CODE---
---SOLUTION_CODE--- #include <stdio.h> #include <stdlib.h>
typedef struct {
int x;
int y;
} point;
int main() {
point * mypoint;
mypoint = (point *)malloc(sizeof(point));
mypoint->x = 10;
mypoint->y =5 ;
printf("mypoint coordinates: %d, %d\\n", mypoint->x, mypoint->y);
free(mypoint);
return 0;
}
---END_SOLUTION_CODE---