ASD
Alokasi Memori Dinamis
Alokasi Memori Dinamis
Untuk menggunakan sebuah variabel, kita harus
Untuk menggunakan sebuah variabel, kita harus
mendeklarasikannya dulu
mendeklarasikannya dulu
Pada saat deklarasi, slot memori dipesan untuk
Pada saat deklarasi, slot memori dipesan untuk
dipakai oleh variabel tersebut
dipakai oleh variabel tersebut
Setelah dideklarasikan, variabel bisa digunakan
Setelah dideklarasikan, variabel bisa digunakan
Ada cara untuk membuat variabel tanpa
Ada cara untuk membuat variabel tanpa
deklarasi!!!
deklarasi!!!
Variabel tersebut baru dibuat saat dibutuhkan
Variabel tersebut baru dibuat saat dibutuhkan
ketika program berjalan!!!
ketika program berjalan!!!
Setelah selesai digunakan, variabel tersebut
Setelah selesai digunakan, variabel tersebut
harus dihapus!!!
Cara membuat variabel
Cara membuat variabel
tanpa deklarasi
tanpa deklarasi
1.
1.
Deklarasikan pointer yang menunjuk variabel
Deklarasikan pointer yang menunjuk variabel
yang akan dibuat
yang akan dibuat
2.
2.
Jika pada saat program berjalan variabel
Jika pada saat program berjalan variabel
tersebut dibutuhkan
tersebut dibutuhkan
Pesan slot memori untuk menyimpan
Pesan slot memori untuk menyimpan
variabel (malloc)
variabel (malloc)
Simpan alamat slot memori pada pointer no
Simpan alamat slot memori pada pointer no
1
1
Gunakan variabel sesuai kebutuhan dengan
Gunakan variabel sesuai kebutuhan dengan
cara akses tak langsung melalui pointer
cara akses tak langsung melalui pointer
Hapus variabel / lepas slot memori setelah
Hapus variabel / lepas slot memori setelah
Karakteristik Alokasi Memori
Karakteristik Alokasi Memori
Dinamis
Dinamis
Memori dapat dipesan atau dilepas sesuai
Memori dapat dipesan atau dilepas sesuai
kebutuhan pada saat program berjalan
kebutuhan pada saat program berjalan
Memesan slot memori menggunakan fungsi
Memesan slot memori menggunakan fungsi
malloc
malloc
malloc:
malloc:
memesan memori untuk variabel
memesan memori untuk variabel
baru
baru
(tipedata *)
(tipedata *)
malloc(
malloc(
size);
size
);
Membuat pointer yang
menunjuk slot memori
yang dipesan. Tipe pointer
sesuai tipe variabel yang
dibuat
Banyaknya slot
memori yang
dipesan untuk
menyimpan
variabel baru
( gunakan fungsi
sizeof()
sizeof()
untuk
mengetahui
ukuran variabel).
malloc()
malloc()
prot
otype ada di
free:
free:
menghapus variabel setelah
menghapus variabel setelah
digunakan
digunakan
void free
void free
(pMemBlock);
(pMemBlock);
Pointer yang
menunjuk
variabel
free()
free()
ada di
stdlib.h
stdlib.h
IMPORTANT!!!!!!
IMPORTANT!!!!!!
:
•
jangan
free()
free()
pointer yang tidak pernah di
malloc()
malloc()
•Jangan
free()
free()
pointer yang sudah difree
Contoh tanpa
Contoh tanpa
malloc()
malloc()
#include <stdio.h>
#include <stdio.h>
#include <conio.h>
#include <conio.h>
int
int
main()
main()
{
{
float jari, luas;
float jari, luas;
jari = 7;
jari = 7;
luas = 3.14 * jari * jari;
luas = 3.14 * jari * jari;
cout << “
cout << “
lingkaran dengan jari-jari : “
lingkaran dengan jari-jari : “
<<
<<
jari;
jari;
cout <<
cout <<
“
“
\n
\n
luasnya : “
luasnya : “
<<
<<
luas;
luas;
getch();
getch();
}
Contoh dengan
Contoh dengan
malloc()
malloc()
#include <stdio.h> #include <stdio.h> #include <conio.h> #include <conio.h> #include <stdlib.h> #include <stdlib.h> void main() void main() { {//deklarasi pointer//deklarasi pointer float *pjari, *pluas;
float *pjari, *pluas;
//memesan slot memori untuk membuat variabel jari & luas. Simpan alamatnya pada pointer//memesan slot memori untuk membuat variabel jari & luas. Simpan alamatnya pada pointer
pjari = (float *)malloc(sizeof(float));pjari = (float *)malloc(sizeof(float));
pluas = (float *)malloc(sizeof(float));pluas = (float *)malloc(sizeof(float));
if (if (pjari != NULL && pluas != NULLpjari != NULL && pluas != NULL){//jika berhasil memesan memori){//jika berhasil memesan memori
//gunakan variabel jari dan luas melalui pointer//gunakan variabel jari dan luas melalui pointer
*pjari = 7;*pjari = 7;
*pluas = 3.14 * *pjari * *pjari;*pluas = 3.14 * *pjari * *pjari;
cout << cout << "lingkaran dengan jari-jari : “"lingkaran dengan jari-jari : “ << << *pjari; *pjari;
cout << cout << ““\n\nluasnya : ", *pluas;luasnya : ", *pluas;
//menghapus atau melepaskan slot memori yang ditunjuk oleh pjari dan pluas//menghapus atau melepaskan slot memori yang ditunjuk oleh pjari dan pluas
Contoh tanpa
Contoh tanpa
malloc()
malloc()
#include <stdio.h>
#include <stdio.h>
#include <conio.h>
#include <conio.h>
struct motor{
struct motor{
float amps;
float amps;
float volts;
float volts;
};
};
typedef struct motor motor;
typedef struct motor motor;
int
int main()
main()
{
{
motor m;
motor m;
m.volts = 4.5;
m.volts = 4.5;
m.amps = 6;
m.amps = 6;
cout <<
cout << "volts =“
"volts =“ <<
<< m.volts;
m.volts;
cout <<
cout << “
“\n
\namps =“
amps =“ <<
<< m.amps;
m.amps;
getch();
getch();
}
Latihan : dengan
Latihan : dengan
malloc?
malloc?
#include <stdio.h>
#include <stdio.h>
#include <conio.h>
#include <conio.h>
#include <stdlib.h>
#include <stdlib.h>
struct motor{
struct motor{
float amps;
float amps;
float volts;
float volts;
};
};
typedef struct motor motor;
typedef struct motor motor;
void main()
void main()
{
{
motor *m;
motor *m;
// Buat alokasi memory dinamis
// Buat alokasi memory dinamis
// Cek alokasi memory ...
// Cek alokasi memory ...
// Free / bebaskan alokasi memory yang dipesan ....
// Free / bebaskan alokasi memory yang dipesan ....
}
Peringatan!!! - malloc
Peringatan!!! - malloc
• Jika
malloc()
malloc()
gagal memesan memori,
akan mengembalikan
NULL
NULL
• Selalu cek apakah
malloc()
malloc()
mengembalikan
NULL
NULL
:
char *pMsg;
char *pMsg;
pMsg = (char *) malloc (sizeof(char));
pMsg = (char *) malloc (sizeof(char));
if (pMsg == NULL)
if (pMsg == NULL)
{
{
cout <<
cout <<
“Insufficient memory. Error Exit”;
“Insufficient memory. Error Exit”;
return -1;
return -1;
}
Peringatan!!!
Peringatan!!!
malloc()
malloc()
• Selalu free() variabel yang sudah selesai
dipakai
• Jika tidak akan menyebabkan
‘memory
‘memory
leaks’
leaks’
Peringatan!!! - free
Peringatan!!! - free
•
Hati – hati!!!
Hati – hati!!!
:
Jangan pernah mem-free slot memori yang
sudah di free!
char *pMsg, *pWord, aLetter;
char *pMsg, *pWord, aLetter;
pMsg = (char *) malloc (20 * sizeof(char);
pMsg = (char *) malloc (20 * sizeof(char);
pWord = pMsg;
pWord = pMsg;
/* both point to same byte 0
/* both point to same byte 0
*/
*/
strcpy(pWord, “Welcome!\n”); /* use the memory */
strcpy(pWord, “Welcome!\n”); /* use the memory */
free(pMsg);
free(pMsg);
/* Free the memory.
/* Free the memory.
*/
*/
free(pWord);
Peringatan!!! - free
Peringatan!!! - free
•
free()
free()
membebaskan slot memori yang
ditunjuk sebuah pointer.
• Jika ada pointer lain yang menunjuk ke
alamat slot yang sama, maka pointer tersebut
menjadi invalid! Jangan difree lagi!
char *pMsg, *pWord, letr = ‘A’;
char *pMsg, *pWord, letr = ‘A’;
pMsg = (char *) malloc (20 * sizeof(char));
pMsg = (char *) malloc (20 * sizeof(char));
/* reserve a memory block */
/* reserve a memory block */
pWord = pMsg;
pWord = pMsg;
/* another pointer to block*/
/* another pointer to block*/
pMsg = &aLetter;
pMsg = &aLetter;
/* pMsg now points to letr */
/* pMsg now points to letr */