2012-08-29 78 views
0

可能重複:
Question about pointers and strings in C差異指針的大小爲一個字符串,和sizeof AA串

#include<stdio.h> 

int main() 
{  
char *str1="abcd"; 
char str2[]="abcd"; 
printf("%d %d %d\n",sizeof(str1),sizeof(str2),sizeof("abcd")); 
return 0; 
} 

爲什麼這段代碼給出相同的答案爲sizeof(str2)sizeof("abcd")甚至當str2理想上就像一個指向字符串的指針,因爲是str1,所以回答應該是4 4 5

代碼上Ideone: http://ideone.com/za8aV

答案:4 5 5

+0

對不起,但這並沒有回答我的問題,爲什麼不應該與str1相同(在它的定義是一個字符串指針) –

+0

第一個是一個指針,第二個是一個數組。一個*指針*和一個*數組*。他們是兩個完全不同的東西。這就是爲什麼他們「不應該是一樣的」。你爲什麼期望兩種完全不同的東西以相同的方式表現?你知道,要回答這樣的問題是非常困難的,因爲幾乎不可能開始理解爲什麼你會發現這種行爲很奇怪。你基本上是問「爲什麼汽車與蘋果不同」。如何回答這樣的問題? – AnT

+0

嗯..得到它,str2 []相當於「abcd」是一個字符數組,而str1是一個指針,那麼你能否清楚疑問str2 []是什麼,它是一個指針還是一個字符串? –

回答

1

你從哪裏得到的想法,str2是「理想情況下就像一個指向字符串的指針「?不是這樣。 str2是一個數組。當運算符sizeof應用於數組時,它將以字節爲單位返回數組對象的大小。

字符串文字也是一個數組,因此當sizeof應用於字符串文字時,它會以字節爲單位返回該數組對象的大小。因此,期望sizeof("abcd")sizeof(str2)產生相同的結果是非常自然的。他們這樣做。

P.S.%d不是用於打印sizeof的結果的適當格式說明符。 %d要求int參數,而sizeof產生size_t值。使用%zu打印size_t類型的值。

+0

使用'std :: ostream',不用擔心實際的類型。 –

+0

@James Kanze:這實際上是一個有趣的問題。 'std :: ostream'確保它「知道」如何輸出'size_t'類型的值嗎?當然,它對所有內置的整型都有'''重載,但'size_t'可以定義爲一個非標準的實現特定的無符號整型。當然,一些合適的轉換可能會使其在任何情況下都能正常工作,但無論如何... – AnT

+0

我在這裏無法訪問C標準。 Posix標準要求'size_t'不要大於'long';該頁面在此聲明與C標準兼容,但要求措辭的方式讓我懷疑;具有這種約束的段落的語言與C標準非常不同。其餘部分:實際上,size_t是標準的整型類型之一,但它看起來好像是C++標準委員會的監督:我期望所有擴展都需要''''整型也是如此。 –

4

字符數組不是char指針。儘管數組在傳遞給函數時會衰減指針,但它們本質上是不同的(特別是編譯器在編譯時知道它們的確切長度)。對於四個字符的字符串,您看到5的原因是字符串文字爲終止零保留一個char4,在另一方面,是依賴於系統:與32位指針系統,你會看到4,同時用64位指針系統,你會看到8

+0

#include int main() { char * str1 =「abcd」; char str2 [] =「abcd」; printf(「%c%c \ n」,* str1,* str2); (%1),sizeof(str2),sizeof(「abcd」)); \ return 0; } http://ideone.com/AZfCz對於* str1和* str2,我都得到相同的輸出,a,a。 –

+0

在編譯時添加了關於確切大小的位。解釋行爲的推理非常重要,不僅僅是手工操作,而是說「這就是它的工作原理」。 – Wug

+0

@Wug謝謝,我正在編輯答案,增加更多細節 - 這是一個重要的補充! – dasblinkenlight