看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《vm6jp6rmp4 (Jun)》之銘言: : 想問一個很簡單的問題,希望有人能告訴我 : #include <stdio.h> : #include <stdlib.h> : int main(void) : { : char *x="Hello"; : *(x+1)='H'; : printf("x=%s",x) : system("pause"); : } : 我希望印出來的是HHllo : 但是為什麼電腦可以Complier但是卻會出現錯誤訊息呢? : 是說指標字串的內容不能改嗎?希望有高手可以詳解囉! "Hello" 存在一塊「唯讀」的記憶體中, 在 char *x="Hello"; 這行定義後, 大概是以下的情況 : ┌─────────────┐ 唯讀區 : │ "Hello" "world" │ │ ↑ │ └─┼───────────┘ ┌─┼───────────┐ 你的程式 │ x┘ │ │ │ │ │ │ │ └─────────────┘ 雖然 x 的型態是 char*, 但是實際上指到的字元都是const char, 修改他是未定義行為 避免這種情況你可以改用 const char *x = "Hello"; 來定 義指標, 這樣任何嘗試修改唯讀區字元的程式碼都會編譯不 過 真的要改字元的唯一方法就是「複製一份」, 改你自己的那 一份就不會有問題了, 程式碼像這樣 : char x[] = "Hello"; // 實際上等同於 char x[6] = "Hello"; // 效果跟 char x[6]; strcpy(x,"Hello") 同 ┌─────────────┐ 唯讀區 : │ "Hello" "world" │ │ │ └─────────────┘ ┌─────────────┐ 你的程式 │ x["Hello"] │ │ │ │ │ │ │ └─────────────┘ 要怎麼改都沒問題, 不過要注意如果陣列不配大一點, 就沒 辦法對 x做字串連接等操作了. 記住一件事 :「看到字串,就要想到陣列」, 雖然很多函式 原型都是吃指標引數 (char*), 但他要的實際上都是已配置 好能任意更改的記憶體空間. -- ◢████ ◢█ ◢██◣ ◢█ ◢███ ◢█ T-ara版怎麼去 ████◢█████s ~> T-ara ███ █ ◢█歡迎您的光臨 ███████████恩靜智妍孝敏 ███ ██ 素妍居麗寶藍 ████◥██◤ █████ψmakigoto123 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.121.197.115
purpose:超級好人 10/23 16:19
想到我當初的學習方法就是看書背一堆規則, 大師怎麼講 我就怎麼做, 所以有些很噁心的問題一輩子都遇不到, 如 果遇到了, 只是更突顯了這些規則的重要性, 自己在那邊 是試半天猜半天是不會有什麼好結論的, 前人的經驗才是 你最好的工具. ※ 編輯: loveme00835 來自: 140.121.197.115 (10/23 17:05)
wendly777:char* xxx = malloc(6); strcpy(xxx, "Hello"); 10/24 00:13
wendly777:這樣應該也是一樣,我認為陣列或指標根本不是重點 10/24 00:14
wendly777:重點是要搞懂你要修改的那塊記憶體,能不能修改 10/24 00:15
這我不是最後一句就有說了嗎...Orz ※ 編輯: loveme00835 來自: 140.121.197.115 (10/24 00:16)
wendly777:我不認為 "看到字串,就要想到陣列",這跟本题完全無關 10/24 00:21
如果你覺得用動態記憶體配置有助於釐清新手的概念, 你 就去做吧, 陣列在操作的過程中也不會把本來擁有的記憶 體位址給遺失掉 ※ 編輯: loveme00835 來自: 140.121.197.115 (10/24 00:32)
wendly777:我認為可以多推薦新手使用陣列,但是此题它就是在問指標 10/24 00:42
wendly777:又扯出陣列,我想他會更不懂指標,此题就是指標指的記 10/24 00:43
wendly777:憶體是否是能夠write 10/24 00:44
我覺得我前面畫的那些圖都是白畫的... 記憶體是否能夠 覆寫, 前面一篇的推文裡其他大大就已經強調過了, 我再 重複不就在衝文? ※ 編輯: loveme00835 來自: 140.121.197.115 (10/24 00:47)
wendly777:你前面的說法是對的,只是我覺得此例用指標講解會比較好 10/24 00:56
wendly777:不然是否會有新手誤以為,只有陣列才可以修改 10/24 00:56
其實這點你不用擔心, 我著色的那句並不是說一定要用陣 列, 而且根據我的經驗, 學生學懂動態記憶體配置後, 遇 到長度不定的問題也會很自然改用「動態陣列」來解. ※ 編輯: loveme00835 來自: 140.121.197.115 (10/24 01:03)