2013-01-04 38 views
4

可能重複:
Sizeof an array in the C programming language?得到一個數組的長度穿過作爲char *後

我有以下形式的代碼:

void arrLen(char* array){ 
    // print length 
} 

int main(){ 
    char bytes[16]; 
    arrLen(bytes); 
} 

我需要做的是獲取底層數組的長度並將其打印出來。問題是該數組可能包含NULL CHARACTERS,因此strlen不起作用。有沒有辦法做到這一點,或者我將不得不通過它作爲char[]而不是char*

+3

嗯,這不是真的怎麼陣列在C中處理。它們不是攜帶長度信息的實際對象。如果您有權訪問C++ 11,請使用std :: array。如果沒有,你必須始終記住自己的記憶長度 –

+1

爲什麼不使用'vector'或'array'? –

+1

void arrLen(char * array,int size) –

回答

6

空調風格數組不要隨身攜帶長度信息。

您有幾個方案可供選擇:

您的數組的大小傳遞給你的函數:

void arrLen(char* array, std::size_t size) 

使用std::array如果你有機會到C++ 11(或TR1在評論mentionned)

std::array<char, 16> bytes; 

如果您無權訪問std :: array,則可以使用boost::array。它們大致相當於標準的。

關於你的評論

我必須把它作爲一個char [],而不是一個char *?

數組總是作爲指針傳遞給函數,所以void arrLen(char* array)void arrLen(char[] array)是等價的。

2

在傳統的方式(C)一個具有大小通過作爲函數的屬性

void arrLen(char* array, int maxSize){ 
    // print length 
} 

int main(){ 
    char bytes[16]; 
    arrLen(bytes, 16); 
} 
1

陣列在C/C++不每說處理這種方式,必須手動跟蹤你自己的長度..改變你的功能像void arrLen(char * array, int size),並指定大小,每當你調用該函數。

3

或者我必須將它作爲char []而不是char *來傳遞嗎?

改變的arrLen()聲明採取char[]型,而不是char*的參數沒有任何作用,因爲在這種情況下,他們是等價的。

一個可能的解決方案是使用一個template功能:

#include <iostream> 

template <typename T, int N> 
void array_size(T (&a)[N]) 
{ 
    std::cout << N << "\n"; 
} 
int main() 
{ 
    array_size("hello"); 
    char bytes[16]; 
    array_size(bytes); 
    return 0; 
} 

http://ideone.com/l7GxDp的演示。

替代使用陣列:

+0

考慮到'std :: array'是C++ 11的標準,所以當提到boost :: array時,我更願意看到這個引用。 – Agentlien

+0

@Agentlien,我知道,但是在對這個問題的評論中,OP聲明C++ 11不可用。 – hmjd

+0

當然,但我仍然可以在括號內添加註釋。因此:* boost :: array (在C++ 11中以std :: array 的形式提供)*這將有助於稍後提到此問題的人員,並且不會有此限制。 – Agentlien

1

如果你有一個C++ 11,我可以建議你使用std::array,它會跟蹤它的大小。

1

不幸的是,char[]char*參數類型是等效的。

你有兩個選擇:

傳遞長度與指針一起像在C一會:

void arrLen(char* array, size_t length) 

或使用模板:

template<size_t sz> 
void arrLen(char (&array)[sz]) 
相關問題