Re: [問題] 關於字串指標的更改
※ 引述《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
推
10/23 16:19, , 1F
10/23 16:19, 1F
想到我當初的學習方法就是看書背一堆規則, 大師怎麼講
我就怎麼做, 所以有些很噁心的問題一輩子都遇不到, 如
果遇到了, 只是更突顯了這些規則的重要性, 自己在那邊
是試半天猜半天是不會有什麼好結論的, 前人的經驗才是
你最好的工具.
※ 編輯: loveme00835 來自: 140.121.197.115 (10/23 17:05)
→
10/24 00:13, , 2F
10/24 00:13, 2F
→
10/24 00:14, , 3F
10/24 00:14, 3F
→
10/24 00:15, , 4F
10/24 00:15, 4F
這我不是最後一句就有說了嗎...Orz
※ 編輯: loveme00835 來自: 140.121.197.115 (10/24 00:16)
→
10/24 00:21, , 5F
10/24 00:21, 5F
如果你覺得用動態記憶體配置有助於釐清新手的概念, 你
就去做吧, 陣列在操作的過程中也不會把本來擁有的記憶
體位址給遺失掉
※ 編輯: loveme00835 來自: 140.121.197.115 (10/24 00:32)
→
10/24 00:42, , 6F
10/24 00:42, 6F
→
10/24 00:43, , 7F
10/24 00:43, 7F
→
10/24 00:44, , 8F
10/24 00:44, 8F
我覺得我前面畫的那些圖都是白畫的... 記憶體是否能夠
覆寫, 前面一篇的推文裡其他大大就已經強調過了, 我再
重複不就在衝文?
※ 編輯: loveme00835 來自: 140.121.197.115 (10/24 00:47)
→
10/24 00:56, , 9F
10/24 00:56, 9F
→
10/24 00:56, , 10F
10/24 00:56, 10F
其實這點你不用擔心, 我著色的那句並不是說一定要用陣
列, 而且根據我的經驗, 學生學懂動態記憶體配置後, 遇
到長度不定的問題也會很自然改用「動態陣列」來解.
※ 編輯: loveme00835 來自: 140.121.197.115 (10/24 01:03)
討論串 (同標題文章)