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

Kirim email ke