2010-01-19 40 views
20

這是否......做這些關於指針的語句有相同的效果嗎?

char* myString = "hello"; 

......有,因爲這同樣的效果?

char actualString[] = "hello"; 
char* myString = actualString; 
+2

它看起來像你可以很容易地編譯和測試代碼......你爲什麼不考呢? – 2010-01-19 19:35:12

+0

這已經被問了一噸!〜 – JonH 2010-01-19 19:35:48

+16

他並不是問它是工作還是編譯。他問是否兩個陳述具有相同的效果(也就是以相同的方式工作)。答案是否定的。 – 2010-01-19 19:36:22

回答

33

char str1[] = "Hello world!"; //char-array on the stack; string can be changed 
char* str2 = "Hello world!"; //char-array in the data-segment; it's READ-ONLY 

第一個例子號創建尺寸13*sizeof(char)的堆疊並複製串"Hello world!"到它上的陣列中。
第二示例創建堆棧上的char*並將其指向在可執行文件,它包含字符串"Hello world!"的數據段的位置。第二個字符串是只讀

str1[1] = 'u'; //Valid 
str2[1] = 'u'; //Invalid - MAY crash program! 
+1

我假設你的意思是'char str1 []'而不是'char [] str1'。 – 2010-01-20 03:08:26

+2

這就是爲什麼一些編譯器警告你,除非你寫的'爲const char *等等= 「blahblah」' – gnud 2010-01-20 12:21:04

+0

[這個答案](http://stackoverflow.com/questions/349025/is-a-string-literal-in- c-static-memory創建/ 349030#349030)解釋了這背後的原因。 – Lazer 2010-09-26 18:09:09

3

號在第一個,你不能修改通過myString指向的字符串,第二個就可以了。閱讀更多here

4

號第一個給你一個指針const數據,如果你通過該指針被改變的任何字符,這是不確定的行爲。第二個將字符複製到一個數組中,這不是const,因此您可以隨意更改任何字符(或者直接在數組中或通過指針),而不會產生任何不良影響。

3

它不一樣,因爲第一個例子中由myString指向的未命名數組是隻讀的並且具有靜態存儲持續時間,而第二個示例中的指定數組是可寫的並具有自動存儲持續時間。

在另一方面,這是接近到等價:

static const char actualString[] = "hello"; 
char* myString = (char *)actualString; 

它仍然是不完全一樣,但因爲通過字符串文字創造的無名數組不保證是唯一的,而明確數組是。因此,在下面的例子:

static const char string_a[] = "hello"; 
static const char string_b[] = "hello"; 
const char *ptr_a = string_a; 
const char *ptr_b = string_b; 
const char *ptr_c = "hello"; 
const char *ptr_d = "hello"; 

ptr_aptr_b被保證比較不等,而ptr_cptr_d可以是相等或不相等 - 兩者都是有效的。