2014-03-02 72 views
0
#include <stdio.h> 
#include <stdlib.h> 

int constChars(const char* str) { 
    int size = sizeof(str)/sizeof(char); 
    printf("Size is %d.\n", size); 
    int i = 0; 
    for (i=0;i<size;i++) 
     printf("%c ", str[i]); 

    return 0; 
} 


int main(void) { 

    char a[10]={'b','c','d','e','f','f','f','f','f','f'}; 
    constChars(a); 
    return 0; 

} 

我寫一塊的像上面的代碼,但輸出的結果是: 大小爲8 bcdeffff打印常量字符陣列通過的sizeof()的結果

我很困惑,爲什麼sizeof()函數給出8的大小? 我使用gcc和freebsd。

+3

指針不是數組。您正在計算指針參數的大小,而不是數組對象的大小。 – ouah

+0

我只是改變了一點,大小來自sizeof(str)/ sizeof(char)。所以它談到了一些問題? – Stan666

+1

你正在測量str的大小,而不是[]。 str是一個指針... make a []任意大小,每次你仍然會得到8(在32位系統上是4)。 –

回答

4

當您將數組傳遞給函數時,它將被重寫爲指針,其中sizeof信息丟失。如果你這樣做的,而不是main,即:

char a[10]={'b','c','d','e','f','f','f','f','f','f'}; 
int size = sizeof(a)/sizeof(a[0]); 
printf("Size is %d.\n", size); 

它打印10預期。但是一旦你將它傳遞給constChars,它就會打印一個指針的大小。

+0

那麼有可能通過它的指針在函數內部獲得一個常量數組的大小? – Stan666

+1

@ robbie88不,你必須和陣列一起傳遞長度。 – 2014-03-02 22:31:46

+0

可能值得注意的是,NULL終止字符流是解決這個問題的傳統方法。通過在字符數組的末尾添加一個'\ 0',可以遍歷一個字符串,直到達到'\ 0'。這是['strlen'](http://www.cplusplus.com/reference/cstring/strlen/)的工作原理。 – millinon

0

str是一個指向char的指針。這通常是4到8個字節。你沒有得到數組的大小,而是變量的大小。知道數組長度的唯一方法是將大小與它一起傳遞,或者可以使用某種信號值(如\ 0)來刪除數組,並進行一些迭代。