On Mon, 23 Oct 2000, Oki DZ wrote:
> Apa betul nih?
> Seumpamanya pada program yang lalu itu saya punya
> char *coba;
> coba = malloc(sizeof(char) * 11);
> coba = NULL;
> tahu darimana library C-nya bahwa ada bagian memori yang perlu di-free()
> saat exit, toh referensi ke memori yang hasil malloc() tersebut sudah
> tidak ada. Dan setahu saya, program C tidak punya runtime-system yang
C tidak mencatat referensi memori seperti itu (tidak seperti java)
untuk setiap memori yang dialokasikan C mencatatnya di sebuah tabel
(atau list tergantung implementasi library-nya). Jadi meskipun tidak
ada variabel yang menunjuk ke lokasi memori tersebut, list-nya tetap
ada. JIka Anda tertarik untuk melihat salah satu implementasi malloc
Anda bisa melihatnya di
http://www.delorie.com/djgpp/malloc/
implementasi yang diberikan memang tidak mem-free lokasi yang dialokasikan
ketika program exit, tapi dari struktur datanya hal itu mungkin dilakukan
(dalam kasus ini free memang tidak diperlukan, tapi jika implementasi
malloc memakai memori yang perlu di free [misalnya EMS atau XMS di DOS]
maka proses ini perlu).
> mengontrol jalannya program. Beda 'kan dengan misalnya Turbo Pascal, kalau
> error, errornya jelas. Kalau C, kan paling-paling segfault.
sebenarnya ini bukan masalah bahasanya, tapi masalah librarynya.
kebetulan hampir semua (semua?) library yang ada sekarang menyerahkan
error handling ke programmer.
> > > > atau labih gampang lagi kalo main() di ganti jadi
> > > > {
> > > > char coba[] = "teststring";
> > dg cara di atas memori yang dialokasikan statik, dgn malloc memori yang
> > dialokasikan dinamik.
>
> Saya coba programnya dengan alokasi string yang statik itu; segfault tuh.
apa yang Anda lakukan sehinngga bisa segfault
dari the C programming language FAQ
(sorry agak panjang, tapi diharapkan semua jadi mengerti)
-------
1.32: What is the difference between these initializations?
char a[] = "string literal";
char *p = "string literal";
My program crashes if I try to assign a new value to p[i].
A: A string literal can be used in two slightly different ways. As
an array initializer (as in the declaration of char a[]), it
specifies the initial values of the characters in that array.
Anywhere else, it turns into an unnamed, static array of
characters, which may be stored in read-only memory, which is
why you can't safely modify it. In an expression context, the
array is converted at once to a pointer, as usual (see section
6), so the second declaration initializes p to point to the
unnamed array's first element.
(For compiling old code, some compilers have a switch
controlling whether strings are writable or not.)
--------
> Sepertinya kalau alokasi statik, memorinya ditaruh di suatu pool tertentu,
> sehingga kalau nanti punya coba2[] = "teststring" di lain tempat,
> compilernya akan mengacukan coba2 ke alamat yang sama dengan coba. Ya
setahu saya untuk inisialisasi
jika ada
char coba[] = "teststring"
lalu
cahr coba2[] = "teststring"
maka alamat yang dipoint oleh coba dan coba2 berbeda
tapi jika
char *coba3 = "teststring"
lalu
char *coba4 = "teststring"
alamat yang ditunjuk coba3 dan coba4 sama (sudah ditest di gcc).
> setidaknya kalau di Java sih begitu, string statik disebutnya immutable;
> alias tak bisa dirubah-rubah. Memang, kita bisa saja punya:
> String myString = "myString";
> myString = myString + "anotherString";
> Sepertinya myString dirubah isinya, padahal sih, "myString" yang pertama
> itu dibuang dulu, lalau isinya myString diganti dengan "myString" +
> "anotherString". Berangkat dari situ, 'kali aja C compiler yang sekarang
> pakai prinsip tersebut (yang alokasinya statik, jadi immutable).
singkatnya alokasi dan penanganan string di C dan Java cukup jauh berbeda.
--
Salam
Yohanes
SMS Mail : [EMAIL PROTECTED]
http://langitbiru.hypermart.net
--------------------------------------------------------------------------------
Utk berhenti langganan, kirim email ke [EMAIL PROTECTED]
Informasi arsip di http://www.linux.or.id/milis.php3
Pengelola dapat dihubungi lewat [EMAIL PROTECTED]