2013-06-28 66 views
0

我檢討用途以下字符串賦值指定字符串爲char *變量

char *str; 
str =""; 

然後編碼器使用這種「STR」暫時保持像一個字符串的代碼。

str = "This is a message"; 
fwrite(str, 1 ,strlen(str), fp); 

然後這個str再次在其他地方用來分配一個具有類似用途的新字符串。

我知道這個工作,我想知道這個工作到底有多精確。 你怎麼能聲明一個char指針,並使它指向這樣的字符串? 指針可以容納的最大字符串長度是多少? 這個字符串存儲在哪裏?它是否自動malloc'd?

+1

最後一段代碼不能編譯。 –

+0

對不起。我編輯了它。感謝您指出它。 –

+0

@SteveH最後的代碼從概念的角度來看非常重要,不需要抱歉和編輯。 – 0decimal0

回答

2

指針不「保持」一個字符串,它只是指向原始字符串的位置。在這種情況下,字符串文字保持爲程序的一部分,指針設置爲它;當您重新指定指針時,您不會創建任何副本,只需將指針設置爲不同的地址即可。

字符串的最大大小因此是字符串文字的最大大小,這取決於編譯器和可用程序空間的大小。

如果你想實際製作一個字符串的副本,首先你必須爲它分配一些存儲空間,這個存儲空間必須大於字符數。然後使用strcpy進行復制。

+0

那麼這個字符串存儲在內存中的位置是什麼?堆? 是否會有極端的情況下,我分配一個非常長的字符串,並導致一些異常? 當我分配一個新的字符串時,原始字符串保持(假設堆)像垃圾? –

+0

@SteveH,字符串文字通常與代碼本身保持在一起,而不是在堆或棧上。 –

+0

謝謝。這有幫助。 –

0

char*只是指向char(或它們的一系列)的指針。

你可以讓它指向你喜歡的任何「字符串」。在給出的例子中,他們只是改變指針的值(即str指向什麼)。

0

char *name;

name="some string"; //將name點的 字符串位置的地址。

不類似於:

炭STR [];

str =「一些字符串」; //記住這種類型的語句 將不起作用,因爲str將要存儲字符,但是您要分配指針的是 。

一個常量字符串總是表示一個指向該字符串的指針。

1

該字符串靜態地包含在對象模塊中。您不需要爲這些字符串使用malloc內存,因爲它們已經擁有由編譯器分配的內存。正因爲如此,你也無法釋放這樣一個指針。如果您在exe文件中使用十六進制編輯器查看,則可以看到這樣的字符串包含在其中,而不是動態分配的字符串,只要可執行文件運行,字符串就只存在於內存中。

這種字符串的最大大小取決於您的編譯器。

+0

明白了。謝謝。這有幫助。 –