我想從指針中指定一個元素與來自同一個指針的另一個元素具有相同的值。從同一個指針指定另一個元素的指針的元素
int testFunc() {
char *p = "123";
p[0] = p[2];
return 0;
}
好奇爲什麼上面的代碼不起作用 - 什麼是最好的方法來實現我想要做的?
我想從指針中指定一個元素與來自同一個指針的另一個元素具有相同的值。從同一個指針指定另一個元素的指針的元素
int testFunc() {
char *p = "123";
p[0] = p[2];
return 0;
}
好奇爲什麼上面的代碼不起作用 - 什麼是最好的方法來實現我想要做的?
您所面臨的問題,因爲你試圖修改string literal它調用undefined behavior。
的問題是在
p[0] = p[2];
而p
指向字符串字面。
引用C11
,章§6.4.5,字符串文字
[...]如果程序試圖修改這樣的陣列,該行爲是 未定義。
你需要有一個數組來代替,T能夠修改的內容,像
char parr[] = "123";
然後
parr[0] = parr[2];
會做。
當你寫char *p = "123"
,p
指向的4個字符的第一個元素只讀內存。真的,你應該編寫const char* p = "123"
來引發編譯時失敗p[0] = p[2];
陳述。
如果要修改字符串,則使用自動存儲持續時間;即寫
char[] p = "123";
p
那麼一個char[4]
型,具有一個NUL - 終止子的最後元件。
該標準不要求內存是隻讀的。它只是說它不能被程序員改變。但是,它允許實現提供可修改的內存。 – Olaf
char * p =「123」;
當你像這樣定義一個指針會被保存在只讀存儲器段的數據,那就是你不能夠修改數據的原因
你幾乎想「的元素分配從與指針相同的值指向同一個指針的另一個元素「,而是從它們指向**的對象開始!你也想讀[問]並提供[mcve]。 – Olaf
此代碼嘗試修改字符串字面量(這是未定義的行爲),該字符串沒有任何功能可以訪問;你究竟想達到什麼目的? –
@Olaf就SO政策而言,這個問題沒有錯。發佈的代碼包含一個MCVE。這裏唯一的問題是在問一個FAQ之前缺乏研究。 – Lundin