Alokasi Memori
Alokasi Memori
Yuliana Setiowati
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.
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
main() typedef struct employee_st {
{ char name[40];
int myInt; int id;
Employee john; } Employee;
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;
}
Hasil Program
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
*p *r
p 3 r 2 2 2002
*q
q 3.14
malloc( ), closer look
sizeof(int) = the
number of bytes
int *p; occupied by an int
p = (int*) malloc(sizeof(int));
Malloc mengalokasikan
storage dengan ukuran 4
byte (int)
p = (int*) malloc(…)
Pointer tersebut haruslah
dikonversi kepada tipe yang sesuai
malloc( )
#include <stdlib.h>
int main () { p ?
int *p; int a=2; *p
p = (int*) malloc(sizeof(int)); p
*p = 4;
*p += a;
… Menghapus sel yang
free(p); ditunjuk p
p = NULL;
}
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.
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");
}
}
free( )
#include <stdlib.h>
int main () { p ?
int *p; int a=2; *p
p = (int*) malloc(sizeof(int)); p
*p = 4;
*p += a; p ?
… Menghapus sel yang
free(p); ditunjuk p
p = NULL;
} Pada saat variabel dinamik tidak
digunakan lagi kita perlu
membebaskannya. Kompiler tidak
mendealokasi storage space secara
otomatis
NULL
#include <stdlib.h>
int main () { p ?
int *p; int a=2; *p
p = (int*) malloc(sizeof(int)); p
*p = 4;
*p += a; p ?
…
free(p); p
p = NULL;
}
#include <stdlib.h>
#include <stdlib.h>
int main () {
int *p; int a=2;
p = (int*) malloc(sizeof(int));
*p = 4;
*p += a;
…
free(p); Menggunakan fungsi malloc(),
p = NULL; free() dan NULL harus
} mengincludekan stdlib.h.
*q = *p
int *p, *q; *p
p = (int*)malloc(sizeof(int)); p 3
q = (int*)malloc(sizeof(int));
*p = 3; *q
q 3
*q = *p;
q=p
*p
p 3
q
Example (A)
#include <stdlib.h> p *p
int main () { 3 *r
r
int *p, *q;
int *r; q 6 *q
p = (int*) malloc(sizeof(int));
r = p; (B) p
q = (int*) malloc(sizeof(int)); ?
r
*p = 3;
*q = *p + *r; (A) q 6 *q
free(r); (B)
r = NULL; (C) (C) p
} ?
r
q 6 *q
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)
}
Memory Leak
#include <stdlib.h> (A) p 3 *p
int main () {
int *p, *q;
p = (int*) malloc(sizeof(int));
*p = 1+2; (A) (B) p 3
q = p; or free(p);
8 *p
p = (int*) malloc(sizeof(int));
scanf("%d", p); (B)
free(p); p = NULL; (C) (C) p 3
}