2012-09-21 57 views
0

可能重複:
How to find the sizeof(a pointer pointing to an array)的sizeof - 指針轉換爲數組

我有以下代碼

int myfunc(char *arr) 
{ 
const int sizearr = sizeof(arr)/sizeof(char); 
} 

這產生指針的大小,而不是char數組的大小[17]我傳遞給函數。我知道我可以使用strlen並解決問題,但有什麼辦法將char * arr指針轉換回char數組[17]爲了使用sizeof(char數組) [17])?

+0

一個char的FYI大小爲1使不反正工作。 – Mike

回答

6

如果你想通過17個字符數組,你需要按引用傳遞它(僅限於C++):

int myfunc(char (&arr)[17]) 
{ 
    unsigned int const sizearr = sizeof arr; 
    // ... 
} 

或做一個模板來推斷大小:

template <unsigned int sizearr> 
int myfunc(char (&arr)[sizearr]) 
{ 
    // ... 
} 

在C中,你根本無法將數組作爲參數傳遞,所以它的責任是分別傳遞數組的大小。

更新:作爲@大衛表明,可以通過將指針傳遞到陣列固定在C數組類型:

int myfunc(char (*arr)[17]) 
{ 
    unsigned int const sizearr = sizeof *arr; 
    // ... 
} 

int main() 
{ 
    char s[17]; 
    return myfunc(&s); 
} 
+0

+1恢復大小的方式永遠不會鬆散:)在C中,如果你通過指針傳遞數組,那麼基本上可以做同樣的事情(但是在編譯時會調整大小!) –

+0

@DavidRodríguez-dribeas:好點關於通過地址傳遞數組。我補充說! –

0

沒有這樣的方式。 char *類型不包含有關「源」(即數組)的任何信息。這就是爲什麼說陣列「衰減」成指針;指針的信息比數組少。

另外,sizeof (char)爲1

0

不是真的,因爲一旦陣列具有decayed to a pointer已經丟失關於它的「原始」形態的所有信息。你總是可以將指針指向char[17],但這是不好的做法。

如果您確實需要有一個數組,請更改函數簽名以接受數組。

1

不,不存在這樣的方式。但在C++中,你可以通過數組大小參數化的函數模板,並通過引用傳遞數組:

template <size_t size> void myfunc(char (&arr)[size]) 
{ 
    for(size_t i = 0; i < size; ++i) std::cout << arr[i]; 
} 

// Usage 
char array[] = "My char array"; 
myfunc(array);