我有這樣的自定義字符串複製功能,我已經注意到,在取消引用,並修改其內容的*dest
參數的變化:在C中,當我修改其內容時,爲什麼我的指針參數會改變?
char *copyArray(char *dest, char *src)
{
char *a = dest;
while (*dest++ = *src++)
;
char *b = dest;
if ((a-b) != 0)
printf("Dest pointer has changed\n");
return dest;
}
如果你考慮下面的代碼:
int main()
{
char name [] = "Hello, there!";
char *new = copyArray(name, "bye");
printf("New is '%s', name is '%s'\n", new, name);
return 0;
}
我得到以下輸出:
Dest pointer has changed
New is 'o, there!', name is 'bye'
爲什麼會發生這種情況?
我的意圖是爲*new
指向相同位置name[]
指向,但顯然隨着地址改變,它指向不同的地方。
我覺得發生的一件事是,一旦複製結束,C將目標字符串的原始內容減去改變的字符數(4代表「再見」)移動到新地址並將其分配給*dest
。
這是真的發生了什麼?有人可以向我解釋爲什麼?
這不是真正的工作相關,我只是想更好地瞭解指針的行爲。
非常感謝您的回覆!
哦,是的,我正在修改dest的內存地址,因此我只得到原始字符串的一部分。我不得不承認我完全忘了那一點。 – Nobilis
@Nobilis不,你沒有改變「dest的內存地址」,而是「內存地址dest **指向**」。非常重要的區別,一開始並不容易理解,但是至關重要的是,如果你想在C – fvu
中發展,那麼我非常感謝:) – Nobilis