(已解決) 關於C字串的一些問題及如何正確印出變數之記憶體位置 [論壇 - Ubuntu 程式設計]


正在瀏覽:   1 名遊客


 到底部   前一個主題   下一個主題  [無發表權] 請登錄或者註冊

(1) 2 »


(已解決) 關於C字串的一些問題及如何正確印出變數之記憶體位置
會員二級
註冊日期:
2012/6/27 20:43
所屬群組:
已註冊使用者
等級: 8
HP : 0 / 176
MP : 27 / 3697
EXP: 6
離線
各位大大好~

小弟最近剛從PHP轉C 還有一些關於C的知識不是很清楚

還請各位大大多多指教~

這次小弟想問的問題是

char *string;

1.這樣宣告出來的字串固然方便好用,但其優缺點有哪些呢?

2.如果要看一個變數的記憶體位置該用下面哪一種方法呢?

方法一:printf( "%p", string );

方法二:printf( "%p", &string );

此兩種方法印出來的東西分別代表什麼呢?

假設有一段Code如下:

char *string = "Hello!!";

string = "I'm fine, thank you!!";

3.我在網路上看到別人說這兩個string使用的是不同的記憶體區塊

此說法是否正確?

4.那麼在程式當中 我不斷給予string新的值是否會造成記憶體的浪費?

5.最後,在C裡面有辦法可以一次串接多個字串嗎?

我目前的做法是使用strcat,但一次只能串接兩個字串。

麻煩各位大大解惑了~<(_ _)>

2013/3/2 15:23
應用擴展 工具箱
回覆: 關於C字串的一些問題及如何正確印出變數之記憶體位置
會員三級
註冊日期:
2009/4/25 16:55
所屬群組:
已註冊使用者
等級: 12
HP : 0 / 294
MP : 62 / 8879
EXP: 76
離線
1.優點是不用宣告字串陣列大小,缺點我不清楚.
5.strcat你就一段段的塞入,也是可以達到加入多個字串的效果.

2,3,4我手邊沒C書跟編譯器,沒辦法幫你,
但這你可以自己寫程式測試看看就知道答案了....

2013/3/2 15:42
應用擴展 工具箱
回覆: 關於C字串的一些問題及如何正確印出變數之記憶體位置
會員二級
註冊日期:
2012/6/27 20:43
所屬群組:
已註冊使用者
等級: 8
HP : 0 / 176
MP : 27 / 3697
EXP: 6
離線
大大您好:

小弟有做過測試了

假設Code如下:

char *string = "Hello!!";

string = "I'm fine, thank you!!";

使用方法二印出來的東西會一樣

使用方法一印出來的東西不一樣

但小弟不知道到底使用哪個方法印出來才是正確的記憶體位置....

如果方法一才是正確的印記憶體位置的話

那麼3的說法就是正確的

間接的 可想而知4的答案應該也會成立

但如果是方法二的話....就全部相反

還是感謝大大百忙之中 抽空回覆小弟 <(_ _)>

2013/3/2 15:58
應用擴展 工具箱
回覆: 關於C字串的一些問題及如何正確印出變數之記憶體位置
會員三級
註冊日期:
2011/4/16 10:39
所屬群組:
已註冊使用者
等級: 9
HP : 0 / 223
MP : 39 / 5461
EXP: 94
離線
迷途小書僮 寫到:
各位大大好~
小弟最近剛從PHP轉C 還有一些關於C的知識不是很清楚


1.
優點:
可以把一連串的值和string放在一起來顯示
如果熟的話用sprintf就能取代strcat

缺點:
printf是C的很基本的print API
就好像php的echo一樣
有什麼問題我真的想不出來

2.
請參考
指標與記憶體位址

3.
是沒錯
只是變成local variable而已

4.
正如3.講的
只要你不是用malloc的話
基本上都是function完成後
這些空間都會被回收

5.
在1.有講了
sprintf是一個很好的東西


你這些問題都是很基本的C programming問題
推薦你去買一本C來學比較好

2013/3/2 18:29
應用擴展 工具箱
回覆: 關於C字串的一些問題及如何正確印出變數之記憶體位置
會員二級
註冊日期:
2012/6/27 20:43
所屬群組:
已註冊使用者
等級: 8
HP : 0 / 176
MP : 27 / 3697
EXP: 6
離線
請問SSG大 有沒有推薦的書籍呢?

最後 感謝兩位大大的提點

小弟受教了~<(_ _)>

2013/3/3 0:19
應用擴展 工具箱
回覆: 關於C字串的一些問題及如何正確印出變數之記憶體位置
會員三級
註冊日期:
2011/4/16 10:39
所屬群組:
已註冊使用者
等級: 9
HP : 0 / 223
MP : 39 / 5461
EXP: 94
離線
要學Linux C API的話
Linux C 函式庫詳解辭典
ISBN:9574424030
這本我覺得不錯

C的話學這個不錯
C How to program, 6/e (IE-Paperback)

學會基本後
其他都是靠Google了

2013/3/3 0:34
應用擴展 工具箱
回覆: 關於C字串的一些問題及如何正確印出變數之記憶體位置
管理員
註冊日期:
2012/1/14 18:41
所屬群組:
討論區管理群
等級: 20
HP : 0 / 480
MP : 159 / 10699
EXP: 23
離線
1. pointer 他只是申請一個外部記憶體的空間來存放資料,基本上的type跟你前面宣告的一樣。
2.通常我看記憶體都用%x不然我都看到他顯示整數。
3. 因為你兩個字串不一樣,兩個字串都需要放在程式裡面,你把他assign給string的時候基本上就是更改string這個變數原本儲存的記憶體位置。

4.基本上你一直給與string只會增加程式的大小而已。
5.strcat

程式執行的時候有所謂的程式原本預設使用的記憶體空間和程式外部可用的記憶體空間。
pointer經過malloc申請記憶體之後,使用的是外部記憶體空間。
如果是這種
string="hello"
因為程式需要儲存hello的字串再程式裡面。所以這個時候string使用的是程式預設使用的記憶體空間。

順便說一下,如˙果使用malloc之後不用free,程式執行的過程使用的記憶體會越來越多,導致memory leak的問題。

2013/3/3 0:50
應用擴展 工具箱
回覆: 關於C字串的一些問題及如何正確印出變數之記憶體位置
管理員
註冊日期:
2011/3/11 6:32
所屬群組:
討論區管理群
等級: 44
HP : 216 / 1084
MP : 1088 / 26813
EXP: 38
離線
以下僅供參考
迷途小書僮 寫到:
char *string;

1.這樣宣告出來的字串固然方便好用,但其優缺點有哪些呢?

優點
* 不用手動向系統要求記憶體空間,減少了 system call 的 overhead
缺點
* 唯讀,不能修改字串內容(相對於使用字元陣列(character array)保存)
* 增加程式的大小以及使用的記憶體空間

迷途小書僮 寫到:
2.如果要看一個變數的記憶體位置該用下面哪一種方法呢?

方法一:printf( "%p", string );

方法二:printf( "%p", &string );

嚴格來說是方法二,因為用這種方式宣告的字串不是變數,string 才是

迷途小書僮 寫到:
此兩種方法印出來的東西分別代表什麼呢?

字串的記憶體地址
指向字元型態資料的指標變數的記憶體地址

迷途小書僮 寫到:
假設有一段Code如下:

char *string = "Hello!!";

string = "I'm fine, thank you!!";

3.我在網路上看到別人說這兩個string使用的是不同的記憶體區塊

此說法是否正確?

應該對

迷途小書僮 寫到:
4.那麼在程式當中 我不斷給予string新的值是否會造成記憶體的浪費?

如果是 3. 的方式的話因為所有的字串都在程式碼中一定會佔記憶體的...

迷途小書僮 寫到:
5.最後,在C裡面有辦法可以一次串接多個字串嗎?

我目前的做法是使用strcat,但一次只能串接兩個字串。

標準 C 函式庫沒有的話可能要自己刻一個出來

2013/3/3 4:11
本篇發表文章以「創用CC BY 3.0 或更新之台灣地區版本」授權條款釋出,如何使用敬請參考
 Creative Commons — 姓名標示 3.0 台灣 — CC BY 3.0 TW
 http://creativecommons.org/licenses/by/3.0/tw/

「你不懂的東西就不要亂講,被懂得人看破手腳就算了,騙不懂的人誤導別人,還要別人把你當成大師,這就真的是說不過去了。」
 by Allen Own
 出處 http://www.plurk.com/p/i4uogm

自由知識創作平台介紹
 https://docs.google.com/document/d/1MGG6lW_0qCgH4U785R-IwSc_INdoBGej1l-JxiA4gPE
如何建立新的自由知識創作平台文件
 https://docs.google.com/document/d/11NdzOW2lGYksfyQIcPMPye5tlmj1J0QTkgPTmQvIvKA
應用擴展 工具箱
回覆: 關於C字串的一些問題及如何正確印出變數之記憶體位置
管理員
註冊日期:
2012/1/14 18:41
所屬群組:
討論區管理群
等級: 20
HP : 0 / 480
MP : 159 / 10699
EXP: 23
離線
為了詳細解決這個問題,我用了組合語言去看。

其實實際上"Hello World" 這個字串存在0x403000
而printf("%p", string) 顯示的是"Hello World"的字串再程式裡面儲存的地方。
而printf("%p", &string) 顯示的事string這個變數,的記憶體位置再哪裡。
第二個方法顯示出來的記憶體,是已經C自動去使用系統函式庫,申請出來的外部記憶體。
所以顯示的位置已經不再程式領空裡面。

2013/3/3 12:55
應用擴展 工具箱
回覆: 關於C字串的一些問題及如何正確印出變數之記憶體位置
管理員
註冊日期:
2012/1/14 18:41
所屬群組:
討論區管理群
等級: 20
HP : 0 / 480
MP : 159 / 10699
EXP: 23
離線
關於第一點的修正。
*string你沒有手動宣告,他還是會自動去使用系統函式庫,申請記憶體,那個式C對pointer的預設設定。

2013/3/3 12:56
應用擴展 工具箱

(1) 2 »

 [無發表權] 請登錄或者註冊


可以查看帖子.
不可發帖.
不可回覆.
不可編輯自己的帖子.
不可刪除自己的帖子.
不可發起投票調查.
不可在投票調查中投票.
不可上傳附件.
不可不經審核直接發帖.