2014-10-08 175 views
0

一個非常基本的C問題。爲什麼以下兩個命令會導致創建具有不同大小的字符串?C基礎:比較「* char」和「char [x]」創建字符串

如下所示,方法1創建一個大小爲8字節的字符串,方法2創建一個大小爲5字節的字符串。

很困惑,爲什麼方法1是創建的大小爲8個字節的字符串...

(我已經看到了這些帖子:Difference of sizeof between char* x and char x[]What is the difference between char s[] and char *s?除非我有一個閱讀,理解失效,它並沒有真正解決方法的原因1創建的大小爲8個字節的字符串。據響應,它似乎是方法1,應創造的4個字節大小的指針)

方法1:

char *string = "ABCD"; 

方法2:

char string2[5] = "ABCD"; 

例如,當我運行下面的程序時,我得到如下所示的輸出。

#include <stdio.h> 

int main(int argc, char *argv[]) 
{ 
    char *string = "ABCD"; 

    printf("Based on \"char *string = \"ABCD\":\n"); 
    printf("Size of string: %ld\n",sizeof(string)); 
    printf("Size of each element of string: %ld\n",sizeof(string[0])); 
    printf("String: %s\n\n", string); 

    char string2[5] = "ABCD\0"; 

    printf("Based on \"char string2[5] = \"ABCD\":\n"); 
    printf("Size of string: %ld\n",sizeof(string2)); 
    printf("Size of each element of string: %ld\n",sizeof(string2[0])); 
    printf("String: %s\n\n", string2); 

    return 0; 
} 

輸出上述程序的:

enter image description here

+2

[C中char s \ [\]和char \ * s有什麼區別?](http://stackoverflow.com/questions/1704407/what-is-the-difference-between-char-s-and-char-s-in-c) – 2014-10-08 22:54:42

+0

另一個可能的愚蠢:http://stackoverflow.com/questions/15538210/sizeof-a-pointer – 2014-10-08 23:32:20

+0

另外,對於'char string3 [] =「ABCDE」;'(沒有聲明大小)'sizeof(string3)== 6'(5個字母+ nul) – 2014-10-08 23:53:22

回答

1

這是因爲在這一行char *string = "ABCD";您聲明字符指針,其大小爲8個字節,其中如在此行char string2[5] = "ABCD";您聲明一個5字符的數組,因爲char是1字節長,而1 * 5 == 5 bytes那麼string2的大小將是5字節

+0

這可能是一個簡單的問題,但是你能否詳細說明爲什麼指向char的指針的大小比它所指向的類型大8倍(如果考慮ABCD中的四個字符,即排除/ 0,則爲2倍)? (我明白爲什麼'char string2 [5] =「ABCD」'結果的大小爲5個字節。) – iceman 2014-10-08 23:00:44

+1

因爲指針存儲內存地址不是字符,內存地址通常是8個字節 – 2014-10-08 23:03:38

+0

我現在明白了,謝謝。我覺得我很困惑,因爲其他線程中的一些響應意味着指針只佔用4個字節的內存,這在32位的情況下的確是如此,但對於64位的情況確實如此(我正在運行後者) 。 – iceman 2014-10-08 23:09:43

0

只有一個char s保存一個ASCII值,這是一個非常小的數字範圍,所以它們每個只佔用1個字節。

char *是一個指向內存地址的指針,這是一個更大的數字範圍,因此需要更多的字節來存儲它。 32位系統上的指針佔用4個字節,而在64位系統上則佔用8個字節。

我認爲你在64位系統上運行?我認爲這就是8字節的原因。

0

在第一個示例中,您聲明瞭一個變量,該變量是指向char的指針。所以,當你的尺寸爲sizeof時,你會得到指針的大小(不是它所指向的大小),它在64位平臺上是8個字節。

在第二個示例中,您聲明瞭一個變量,該變量是一個數組char。在C中,sizeof數組的操作與您所期望的相同 - 它返回數組的大小(以字節爲單位),在本例中爲5 * sizeof(char)(因爲您聲明瞭5個字符的數組),即5(自sizeof(char) = 1起)。

在任何一種情況下,使用sizeof通常都不是測量字符串長度的正確方法 - 您應該使用strlen來代替。這將正確處理字符串結束符NUL出現在char數組末尾以外的情況。