2012-11-28 70 views
-1

可能重複:寫入c評估所述陣列的大小

#include<stdio.h> 

int main() 
{ 
    char a[]="Visual C++"; 
    char b[] = "Visual\C++"; 
    printf("%d, %d\n", sizeof(a), sizeof(b)); 
    printf("%d, %d", sizeof(*a), sizeof(*b)); 
    return 0; 
} 

OUTPUT
How to find the sizeof(a pointer pointing to an array)

示例代碼

11,10

1,1

1)爲什麼sizeof(a)顯示11,雖然它只有10字符。

2.)爲什麼sizeof(a)sizeof(b)表示不同的輸出,儘管它們具有相同數量的字符。

+0

不要忘了空字符...而反衝'\\'是一個轉義字符。 – Mysticial

+0

這意味着..如果我們不知道數組的大小,我們必須迭代整個數組的元素。所以在那種情況下,將不得不移動到**'(sizeof(a)-2)** **不是?? – Ravi

+0

'sizeof(a)'會給你數組的大小。 (以及'char'類型的數組長度)。 'strlen(a)'會給你第一個空字符之前的字符數。 – Mysticial

回答

3

因爲在字符串的末尾有一個null\0),並且\C被解釋爲單個字符。

如果您希望反斜槓以C字符串顯示,您必須使用另一個反斜槓將其轉義。

char b[] = "Visual\C++"; \\ 10 characters including the null terminator 
char b[] = "Visual\\C++"; \\ 11 characters including the null terminator 
0

1 - 監守,所述串具有00字節(又名空終止)就可以了多數民衆贊成列入的sizeof

2 *被該串中的第一個字符 - 1個炭的大小是1

0

a包含10個字符,加上終止空('\0')字符;因此大小爲11.

ab不包含相同數量的字符。在b中,\C部分被視爲轉義序列,並計爲一個字符。如果您想要顯示\,請使用"Visual\\C++"

0

點1:

「的Visual C++」 長度= 11/*包括空字符*/

「的視覺\ C++」 長度= 10/*包括空字符和 '\ C' 是解釋爲一個字符。

點2:

*a意味着你正在訪問的第一個字符。

*a < =>a[0]兩者都是相同的。

a[0]在您的情況下爲'V',長度爲1

0

看它從一個字符立場來看:

char a[]="Visual C++"; 

printf("length = %d\n", strlen(a)); 
for(int i = 0; i<strlen(a); i++) 
    printf("a[%d] = %c (ASCII %d)", i, a[i], a[i]); 

有了這樣的代碼,你會得到

length = 11 
a[0] = V (86) 
a[1] = i (105) 
a[2] = s (115) 
a[3] = u (117) 
a[4] = a (97) 
a[5] = l (108) 
a[6] = (32) 
a[7] = C (67) 
a[8] = + (43) 
a[9] = + (43) 
a[10] = (0) 

檢查針對ASCII Table這些值,你可以看到爲什麼它顯示11( NULL終止符)

char b[] = "Visual\C++"; 

你的第二個字符串ha這是一個轉義字符\,有很多lists of them,但它基本上告訴編譯器忽略下一個字符,因爲它不會被打印,但有些特殊。就像換行符:'\n'


基於原始發表您的意見,我想我需要澄清兩個額外的東西:

額外注1: 一個特殊的字符,如換行'\n'或空終止符'\0'只需佔用1個額外的字節空間。

額外注2: sizeof(a)會給你數組的大小(字符數),因爲它是完全只需要1個字節的字符。當你使用這個在其他類型的佔用更多的空間,你需要做的一個步驟:

int arr[4] = {0}; 
int size_of_arr = sizeof(arr/sizeof(int)); 
0

在Linux內核是宏:

#define ARRAY_SIZE(x) (sizeof(x)/sizeof((x)[0]))