2015-10-18 61 views
-1
char *name= "tony"; 
    name[2] = 'z'; 
    printf("%s",name); 

爲什麼這會給我一個總線錯誤10?這是什麼意思? 這本書告訴我的,因爲「託尼」字符串文字保存在只讀存儲器中,你不能改變它,但我不明白,因爲我可以做這樣的事情..獲取「總線錯誤10」錯誤消息?

char *name= "tony"; 
    name = "another"; 
    printf("%s",name); 

在這我只是改變了只讀內存,它工作正常。 感謝指針給我頭疼

回答

2
char *name= "tony"; 
name = "another"; 
printf("%s",name); 

在這種情況下,你沒有在只讀存儲器更改數據。你只是讓name指針指向另一個只讀存儲器(存儲「另一個」)。

char *name= "tony"; 
name[2] = 'z'; 
printf("%s",name); 

在這種情況下,您實際上正在編輯存儲在只讀存儲器中的數據。

+0

我明白了,我有沒有創建另一個陣列稱爲「另一個」並將其存儲在堆棧? – Charana

+0

它不是另一個數組。它的另一個字符串文字存儲在只讀存儲器的其他位置。 – Haris

+0

所以在堆棧中存儲字符串文字的唯一方法是使用'char name []'? – Charana

2
char *name= "tony"; 

字符串文字"tony"是在只讀存儲器中。它是一個常量。你不能修改它。這意味着你不能做到這一點 -

name[0]='a';   // this should not be done 

OTOH -

char *name= "tony"; 
name = "another";  // no problem will execute correctly 

你只改變其中的指針name點。這是有效的,因爲指針不恆定。

因此,您不能修改文字,但您可以更改指針name指向的內容。

好吧,如果你聲明這樣的 -

char name[]="tony"; 
name[2] = 'z';   // completely valid 
printf("%s",name);