Halo, > --- Ursprüngliche Nachricht --- > Von: "Me Junk" <[EMAIL PROTECTED]> > An: [email protected] > Betreff: [linux-programming] gcc -Wall tdk memberi warning > Datum: Wed, 3 May 2006 15:35:44 +0700 > > Program1: > ... > char awal[3] = "ABCDE"; > char akhir[8] = "WXZY"; > > int main () { > printf("awal: %s\nakhir: %s\n", awal, akhir); > return (0); > } > > > Program2: > ... > char awal[3]; > char akhir[8] = "WXZY"; > > int main () { > strcpy(awal, "ABCDE"); > printf("awal: %s\nakhir: %s\n", awal, akhir); > return (0); > } > > Di compile dgn: gcc -Wall -ostr1 str1.c > > Mengapa pada program2 gcc tdk memberikan warning dan hasilnya benar? > awal: ABCDE dan bukan ABCWXZY >
Saya coba jawab dengan pendekatan alokasi memori. Di program2 anda beruntung karena compiler tidak mengalamatkan array 'akhir' dengan menimpa alamat array 'awal'. Bisa dilihat pada hasil program 2 dibawah ini ----------Program2 start------------- awal: ABCDE akhir: WXZY Alamat memory 'awal' = 0x8049650 Alamat memory 'akhir' = 0x8049644 ----------Program2 end--------------- Array 'awal' dimulai dari alamat 0x8049650 sedangkan array 'akhir' dimulai dari alamat 0x8049644. Bandingkan dengan hasil dari program1 ---------Program1 start--------------- awal: ABCWXZY akhir: WXZY Alamat memory 'awal' = 0x80495ec Alamat memory 'akhir' = 0x80495ef ---------Program1 end----------------- Anda bisa lihat array 'awal' dimulai dari alamat 0x80495ec sedangkan array 'akhir' dimulai dari alamat 0x80495ef. Karena anda memberikan tempat untuk array 'awal' hanya tiga maka lokasi tertinggi untuk array 'awal' adalah = (0x80495ec + 3)-1 = 0x80495ee sedangkan anda menginisialisasi array 'awal' dengan lima string dimana membutuhkan setidaknya lima lokasi memori yang dimana lokasi tertingginya adalah (0x80495ec + 5)-1 = 0x80495f0. Jadi, array 'awal' : A => 0x80495ec B => 0x80495ed C => 0x80495ee D => 0x80495ef E => 0x80495f0 Sekarang kita lihat array 'akhir'. Array 'akhir' dimulai dari 0x80495ef. Jadi, W => 0x80495ef X => 0x80495f0 Z => 0x80495f1 Y => 0x80495f2 Bisa dilihat bahwa 'W' menimpa 'D' dan X' menimpa 'E'. Kesalahan ini bisa dimodelkan di program2 dengan menambahkan, ------------- for (n = 0; n < 4; ++n) *(awal+3+n) = *(akhir+n); ------------- Semoga mambantu, Regards, Bayu Kanigoro -- Echte DSL-Flatrate dauerhaft für 0,- Euro*! "Feel free" mit GMX DSL! http://www.gmx.net/de/go/dsl -- Berhenti langganan: [EMAIL PROTECTED] Arsip dan info: http://linux.or.id/milis
