---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: ```c typedef struct { char * name; int age; } person; ``` Untuk mengalokasikan orang baru dalam argumen `myperson`, kita gunakan sintaks berikut: ```c 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 `->`: ```c myperson->name = "John"; myperson->age = 27; ``` Setelah selesai menggunakan struktur yang dialokasikan secara dinamis, kita bisa melepaskannya menggunakan `free`: ```c 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 #include 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 #include 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---