Alokasi Memori
Transcript of Alokasi Memori
![Page 1: Alokasi Memori](https://reader036.fdocument.pub/reader036/viewer/2022082213/588496a71a28abee458b935e/html5/thumbnails/1.jpg)
Alokasi Memori
Yuliana Setiowati
![Page 2: Alokasi Memori](https://reader036.fdocument.pub/reader036/viewer/2022082213/588496a71a28abee458b935e/html5/thumbnails/2.jpg)
Alokasi Memori Menyediakan fasilitas untuk membuat
ukuran buffer dan array secara dinamik.• Dinamik artinya bahwa ruang dalam
memori akan dialokasikan ketika program dieksekusi (run time)
• Fasilitas ini memungkinkan user untuk membuat tipe data dan struktur dengan ukuran dan panjang berapapun yang disesuaikan dengan kebutuhan di dalam program.
![Page 3: Alokasi Memori](https://reader036.fdocument.pub/reader036/viewer/2022082213/588496a71a28abee458b935e/html5/thumbnails/3.jpg)
sizeof()• Untuk mendapatkan ukuran dari berbagai tipe data, variabel ataupun struktur. •Return value : ukuran dari obyek yang bersangkutan dalam byte. •Parameter dari sizeof() : sebuah obyek atau sebuah tipe data
![Page 4: Alokasi Memori](https://reader036.fdocument.pub/reader036/viewer/2022082213/588496a71a28abee458b935e/html5/thumbnails/4.jpg)
main()
{
int myInt;
Employee john;
printf("Size of int is %d\n",sizeof(myInt));
printf("Size of int is %d\n",sizeof(int));
printf("Size of Employee is %d\n",sizeof(Employee));
printf("Size of john is %d\n",sizeof(john));
printf("Size of char is %d\n",sizeof(char));
printf("Size of short is %d\n",sizeof(short));
printf("Size of int is %d\n",sizeof(int));
printf("Size of long is %d\n",sizeof(long));
printf("Size of float is %d\n",sizeof(float));
printf("Size of double is %d\n",sizeof(double));
return 0;
}
typedef struct employee_st {
char name[40];
int id;
} Employee;
![Page 5: Alokasi Memori](https://reader036.fdocument.pub/reader036/viewer/2022082213/588496a71a28abee458b935e/html5/thumbnails/5.jpg)
Hasil Program
![Page 6: Alokasi Memori](https://reader036.fdocument.pub/reader036/viewer/2022082213/588496a71a28abee458b935e/html5/thumbnails/6.jpg)
Fungsi malloc()• Untuk mengalokasikan memori • Bentuk prototypenya adalah void *malloc(int jml_byte);
Return value : • Berhasil : sebuah pointer yang tak bertipe (pointer to void) yang menunjuk ke buffer yang dialokasikan • Gagal : return value berupa sebuah pointer NULL.• Pointer tersebut haruslah dikonversi kepada tipe yang sesuai (dengan menggunakan type cast) agar bisa mengakses data yang disimpan dalam buffer.
![Page 7: Alokasi Memori](https://reader036.fdocument.pub/reader036/viewer/2022082213/588496a71a28abee458b935e/html5/thumbnails/7.jpg)
main()
{
char s1[] = "This is a sentence";
char *pblok;
pblok = (char *) malloc(strlen(s1) + 1);
if (pblok == NULL) printf("Error on malloc\n");
else {
strcpy(pblok,s1);
printf("s1: %s\n", s1);
printf("pblok: %s\n", pblok);
return 0;
}
}
![Page 8: Alokasi Memori](https://reader036.fdocument.pub/reader036/viewer/2022082213/588496a71a28abee458b935e/html5/thumbnails/8.jpg)
malloc( ) int *p; double *q; Date *r; p = (int*) malloc(sizeof(int)); q = (double*) malloc(sizeof(double)); r = (Date*) malloc(sizeof(Date));
p
q
r3*p
3.14*q
2*r
2 2002
![Page 9: Alokasi Memori](https://reader036.fdocument.pub/reader036/viewer/2022082213/588496a71a28abee458b935e/html5/thumbnails/9.jpg)
malloc( ), closer lookint *p; p = (int*) malloc(sizeof(int));
sizeof(int) = the number of bytes occupied by an int
Malloc mengalokasikan storage dengan ukuran 4 byte (int)
p = (int*) malloc(…) Pointer tersebut haruslah dikonversi kepada tipe yang sesuai
![Page 10: Alokasi Memori](https://reader036.fdocument.pub/reader036/viewer/2022082213/588496a71a28abee458b935e/html5/thumbnails/10.jpg)
malloc( )#include <stdlib.h>int main () { int *p; int a=2; p = (int*) malloc(sizeof(int)); *p = 4; *p += a; … free(p); p = NULL;}
p
p*p
?
Menghapus sel yang ditunjuk p
![Page 11: Alokasi Memori](https://reader036.fdocument.pub/reader036/viewer/2022082213/588496a71a28abee458b935e/html5/thumbnails/11.jpg)
Fungsi free()• Jika bekerja dengan menggunakan memori yang dialokasikan secara dinamis, maka memori harus dibebaskan kembali setelah selesai digunakan untuk dikembalikan kepada sistem. • Setelah suatu ruang memori dibebaskan, ruang tersebut bisa dipakai lagi untuk alokasi variabel dinamis lainnya. • Bentuk deklarasi
void free(void *pblok);
dengan pblok adalah pointer yang menunjuk ke memori yang akan dibebaskan. • Dalam hal ini, pointer pblok tidak perlu di-cast kembali ke void terlebih dahulu. Compiler otomatis telah menangani proses ini.
![Page 12: Alokasi Memori](https://reader036.fdocument.pub/reader036/viewer/2022082213/588496a71a28abee458b935e/html5/thumbnails/12.jpg)
Fungsi free()main(){
char *pblok; pblok = (char *) malloc(500 * sizeof(char)); if (pblok == NULL)
puts("Error on malloc");else { puts("OK, alokasi memori sudah dilakukan");
puts("------");free(pblok);puts("Blok memori telah dibebaskan
kembali");}
}
![Page 13: Alokasi Memori](https://reader036.fdocument.pub/reader036/viewer/2022082213/588496a71a28abee458b935e/html5/thumbnails/13.jpg)
free( )#include <stdlib.h>int main () { int *p; int a=2; p = (int*) malloc(sizeof(int)); *p = 4; *p += a; … free(p); p = NULL;}
Pada saat variabel dinamik tidak digunakan lagi kita perlu membebaskannya. Kompiler tidak mendealokasi storage space secara otomatis
p
p*p
p ?
?
Menghapus sel yang ditunjuk p
![Page 14: Alokasi Memori](https://reader036.fdocument.pub/reader036/viewer/2022082213/588496a71a28abee458b935e/html5/thumbnails/14.jpg)
NULL#include <stdlib.h>int main () { int *p; int a=2; p = (int*) malloc(sizeof(int)); *p = 4; *p += a; … free(p); p = NULL;}
p
p*p
p ?
?
p
![Page 15: Alokasi Memori](https://reader036.fdocument.pub/reader036/viewer/2022082213/588496a71a28abee458b935e/html5/thumbnails/15.jpg)
#include <stdlib.h>#include <stdlib.h>int main () { int *p; int a=2; p = (int*) malloc(sizeof(int)); *p = 4; *p += a; … free(p); p = NULL;}
Menggunakan fungsi malloc(), free() dan NULL harus mengincludekan stdlib.h.
![Page 16: Alokasi Memori](https://reader036.fdocument.pub/reader036/viewer/2022082213/588496a71a28abee458b935e/html5/thumbnails/16.jpg)
*q = *p
int *p, *q;p = (int*)malloc(sizeof(int));q = (int*)malloc(sizeof(int));*p = 3;*q = *p;
3p
q*q
*p
3
![Page 17: Alokasi Memori](https://reader036.fdocument.pub/reader036/viewer/2022082213/588496a71a28abee458b935e/html5/thumbnails/17.jpg)
q = p
int *p, *q;p = (int*) malloc(sizeof(int));q = (int*) malloc(sizeof(int));*p = 3; q = p;
3p
q*q
*p
3*q
*pp
q
![Page 18: Alokasi Memori](https://reader036.fdocument.pub/reader036/viewer/2022082213/588496a71a28abee458b935e/html5/thumbnails/18.jpg)
Example#include <stdlib.h>int main () { int *p, *q; int *r; p = (int*) malloc(sizeof(int)); r = p; q = (int*) malloc(sizeof(int)); *p = 3; *q = *p + *r; (A) free(r); (B) r = NULL; (C)}
3r6q *q
*pp*r
(A)
(B)r
6q *q
p?
(C)r
6q *q
p?
![Page 19: Alokasi Memori](https://reader036.fdocument.pub/reader036/viewer/2022082213/588496a71a28abee458b935e/html5/thumbnails/19.jpg)
Latihan#include <stdlib.h>int main () { int *p, *q; int *r; int *s; p = (int*) malloc(sizeof(int)); r = p; *p = 5; p = (int*) malloc(sizeof(int)); q = p; s = r; *q = *s + 1; *r = *p * 2; (A) free(r); r = NULL; free(q); q = NULL; (B)}
![Page 20: Alokasi Memori](https://reader036.fdocument.pub/reader036/viewer/2022082213/588496a71a28abee458b935e/html5/thumbnails/20.jpg)
Memory Leak#include <stdlib.h>int main () { int *p, *q; p = (int*) malloc(sizeof(int)); *p = 1+2; (A)
p = (int*) malloc(sizeof(int)); scanf("%d", p); (B) free(p); p = NULL; (C) }
3p *p
3p
*p8
(A)
(B)
3p(C)
q = p; or free(p);
Pada saat p=NULL; maka *p tidak dapat diakses lagi
![Page 21: Alokasi Memori](https://reader036.fdocument.pub/reader036/viewer/2022082213/588496a71a28abee458b935e/html5/thumbnails/21.jpg)
Pointer yang tidak valid#include <stdlib.h>int main () { int *p, *q; p = (int*) malloc(sizeof(int)); q = p; *q = 3; (A) free(q); q = NULL; (B)
}
3q*pp
*q
(A)
Setelah free(q), sel *p (dan *q) tidak ada. Oleh sebab itu kita tidak dapat menggunakan *p atau *q.
(B)qp
?printf("%d %d", *p, *q);*p = 999;*q = 999;
![Page 22: Alokasi Memori](https://reader036.fdocument.pub/reader036/viewer/2022082213/588496a71a28abee458b935e/html5/thumbnails/22.jpg)
Free sel yang tidak digunakan hanya satu kali
#include <stdlib.h>int main () { int *p, *q; p = (int*) malloc(sizeof(int)); q = p; *q = 3; (A) free(q); q = NULL; (B)
p = NULL; (C)}
3q*pp
*q
(A)
Free untuk tiap sel yang tidak digunakan hanya dilakukan satu kali (Bukan free tiap pointer satu kali)
(B)qp
?
free(p); (C)qp
![Page 23: Alokasi Memori](https://reader036.fdocument.pub/reader036/viewer/2022082213/588496a71a28abee458b935e/html5/thumbnails/23.jpg)
Jangan Free() Variabel Static#include <stdlib.h>int main () { int *p, *q; int a = 5; p = (int*) malloc(sizeof(int)); q = &a; *p = 3; (A) free(p); p = NULL; (B)
q = NULL; (C)}
Kita hanya perlu membebaskan variabel dinamik. Bukan variabel biasa. Ingat Free() untuk malloc() saja.
free(q);
5q
*pp*q
(A) 3
a
(B)qp
5 *qa
(C)qp
5a
![Page 24: Alokasi Memori](https://reader036.fdocument.pub/reader036/viewer/2022082213/588496a71a28abee458b935e/html5/thumbnails/24.jpg)
Fungsi realloc()• Untuk mengalokasikan ulang memori yang dipesan • Fungsi ini akan mengalokasikan kembali pointer yang sebelumnya telah diatur untuk menunjuk sejumlah lokasi, memberinya ukuran yang baru (bisa jadi lebih kecil atau lebih besar). • Bentuk deklarasi :...
pblok = (char *) malloc(500 * sizeof(char));
...
pblok = realloc(pblok, 600 * sizeof(char));
![Page 25: Alokasi Memori](https://reader036.fdocument.pub/reader036/viewer/2022082213/588496a71a28abee458b935e/html5/thumbnails/25.jpg)
Fungsi realloc()• fungsi ini memberikan return value berupa pointer yang sama, meng-copy data lama ke lokasi baru dan mengarahkan pointer ke sejumlah lokasi baru tersebut • membebaskan blok memori yang lama. • Jika berhasil : melakukan relokasi baru.• Jika tidak berhasil : return value berupa NULL. • Cara terbaik adalah mengecek hasil realloc() untuk memastikan hasilnya bukan NULL pointer, sebelum kemudian menumpuki pointer lama dengan return value dari realloc().