Benny Prijono wrote:
>
> Agus Budy Wuysang wrote:
> >
> > jadi = array of | pointer to char (char *argv[])
> >
> > Yang menyatakan (const pointer | to something) mana?
>
> justru itu, tidak perlu ada.
> mis:
> int main(int argc, const char *argv[])
> {
> char *p = "hello world";
> argv[0] = p; <-- tidak berbahaya
Memang tidak berbahaya karena p sendiri menunjuk ke read-only
location yang sudah dialokasikan... tapi argv seharusnya
tidak dimodifikasi saat runtime
Sebaliknya
const * char argv[] akan memberi warning saat compile
bahwa anda seharusnya tidak 're-point' const pointer
> puts(argv[0]);
> return 0;
> }
>
> statement di atas akan mengassign isi variabel p ke argv[0]. Menurut
> saya sih statement di atas nggak berbahaya (paling nggak sih nggak
Meamng tidak, tapi 'char * const argv[]' kan memberi warning
sesuai tugasnya untuk 'const pointer'
> akan segfault, IMO). Yang lebih berbahaya adalah kalau kita berusaha
> mengcopy string ke argv[0] (misalnya, strcpy(argv[0], "hello world")).
> Tapi, dengan deklarasi argv seperti di atas, statement seperti ini
> akan meng-generate warning ketika di compile, jadi aman..
Anda berusaha mengopy sesuatu ke tempat yang belum dialokasikan
sepenuhnya ini masalah lain lagi... (bukan tugas 'const pointer'
warning) tapi alokasi memory pada tempat yang ditunjuk oleh
'const pointer'.
'const char *argv[]' sendiri akan warning karena yang dideclare
const adalah 'variable char' ie. 'const char' tempat yang ditunjuk
oleh (non const) pointer.
> Sebaliknya, dengan deklarasi argv seperti di bawah ini:
>
> int main(int argc, char * const argv[])
> {
> strcpy(argv[0], "very very very very long string");
> return 0;
> }
>
> program di atas akan dikompile bersih, alias tidak ada warning. Kalau
> string yg. dicopy panjang sekali, program bakalan segfault.
Tidak ada warning sebab compiler berpikir bahwa argv[] sudah
dialokasikan sepanjang nama program itu sendiri (argv[0]).
> Anyway, kalau paranoid sih kita bisa meng-const argv dua kali:
>
> $ cdecl explain 'const char *const argv[]'
> declare argv as array of const pointer to const char
tidak perlu sebab argv[x][y] sebagai char yang tidak
memerlukan const... yang equiv:
char * const argv[]
adalah
char * const * const argv;
C selalu right to left.
Oh well kalau memang 'const * const argv[]' kurang benar; berarti
yang bikin getopt(3) & execve(2) pasti lagi ngantuk... :)
--
+---| Netscape Communicator 4.x |---| Powered by Linux 2.2.x |---+
|/v\ Agus Budy Wuysang MIS Department |
| | Phone: +62-21-344-1316 ext 317 GSM: +62-816-1972-051 |
+--------| http://www.rad.net.id/users/personal/s/supes |--------+
--------------------------------------------------------------------------------
Utk berhenti langganan, kirim email ke [EMAIL PROTECTED]
Informasi arsip di http://www.linux.or.id/milis.php3
Pengelola dapat dihubungi lewat [EMAIL PROTECTED]