2012-01-01 89 views
1

這看起來應該很容易,但我花了太多時間在它上面。希望有人能幫助。更改指針數組的內容

char *labels[] = { "apple", "orange" }; // each items inside label is string literal. We can't change them- 

看看下面的

char a[]="hi"; 
char b[]="hello"; 
char *name[]={a,b};//each item inside name is not string literal rite?? 
*name="bye"; 
puts(a); 

我想輸出將是bye,因爲我改變了使用*name="bye"

中的a[]內容,但輸出仍是hi。爲什麼?

回答

5

char *name[]={a,b};//each item inside name is not string literal rite?? - 不完全一樣,每個元素都是指向char的指針。因爲name是指針數組。 *name="bye"改變了這些指針中的第一個指針的變化。它不會更改舊指針指向的內存。

如果你想這樣做,你一般會使用strncpy,但請注意,在這裏你沒有足夠大的數組來做這件事。

(我本來還期待你的編譯器給你有關分配const char *char**name="bye"警告)

*name="bye"前:

State before

*name="bye"

State after

+0

當我調試時,我發現你所說的正在發生。但是'* name'的地址是'a []'rite?對'* name'的任何修改都必須反映在'a []'rite ?.不,我沒有得到任何警告。 – intex0075 2012-01-01 05:26:49

+0

編號'*名稱'仍然是一個指針,指向'a'。 '* name'改變指針指向的內容。 – Flexo 2012-01-01 05:27:54

+0

所以,現在*名稱已經改變,指向其他的東西,尋找乙,並期待它是「你好」不是真的有效,對吧? – user973572 2012-01-01 05:30:59