Agus Budy Wuysang wrote:
>
> > $ cdecl explain 'const char *argv[]'
> > declare argv as array of pointer to const char
>
> array of | pointer to | const char
> ^^^^^^^^^^
> char bukan pointer, const/non-const sama saja
^^^^^^
no, no... tidak sama dong :-).
$ cdecl explain 'const char *p'
declare p as pointer to const char
dengan deklarasi seperti ini, isi dari 'p' tidak bisa dirubah, mis:
const char *p;
p[0] = 'X'; <-- warning: assignment of read-only location
*p = 'X'; <-- warning: assignment of read-only location
tapi var. 'p'-nya sendiri bisa dikutak-katik, mis:
while (*p++)
;
> 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
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
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..
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.
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
cheers,
Bennylp
--------------------------------------------------------------------------------
Utk berhenti langganan, kirim email ke [EMAIL PROTECTED]
Informasi arsip di http://www.linux.or.id/milis.php3
Pengelola dapat dihubungi lewat [EMAIL PROTECTED]