2013-04-02 70 views
14

我很難找到指針數組的長度。比方說,我有:C++如何獲取指針數組的長度?

char array[40] = "hello"; // size 40 
int length = sizeof array/sizeof array[0]; // no problem returns 40 

//如何只用指向該數組中第一個元素的指針來獲取數組的長度?

char* pchar = array; 

//如果

std::strlen(pchar); // this returns the length of 5... i want length 40 

//如果

int count = 0; 
while(true) 
{ 
    if(*(pchar + count) == '\0') // returns 5... 
    break; 
    count++; 
} 

我如何得到它只是從返回一個指針長度40到陣列中的第一個元素?
我發現我可以做到這一點。

int count = 0; 
    while(true) 
    { 
     if(*(pchar + count) == '\0' && *(pchar + count + 1) != '\0') 
      break; 

     count++; 
    } 

這會返回39,這很好,但我覺得在某些情況下這可能會出現問題。

+13

你不能從一個指針數組的長度。 – juanchopanza

+0

有黑客,但沒有內置的方式來做到這一點。 – ApproachingDarknessFish

回答

15

你不能,我很害怕。你需要將數組的長度傳遞給任何需要它的人。或者你可以使用std::arraystd::vector或類似的,它們自己跟蹤長度。

+0

嗯,但我最後一塊代碼返回39,+1 = 40。爲什麼這不好? –

+0

@JavaNewb:你正在將數組的末尾讀入未定義的內存,這很可能導致崩潰。 – RichieHindle

3

你不能。道德是,不要使用指針和數組,使用向量。你總是可以獲得矢量的大小。

3

的確,您無法從指向數組元素的指針獲取數組大小。

如果你只有一個指針的原因是因爲你的功能實現,它接受一個數組參數作爲這樣一個論點:

void foo (T *p) { 
    // p is a pointer to T 
} 

那麼你可以使用一個模板函數,而不是讓數組的大小到功能。

template <unsigned N, typename T> 
void foo (T (&p)[N]) { 
    // p is a reference to an array[N] of T 
    std::cout << "array has " << N << " elements" << std::endl; 
    std::cout << "array has " 
       << sizeof(p)/sizeof(p[0]) 
       << " elements" 
       << std::endl; 
} 

int main() 
{ 
    int array[40]; 
    char array2[25]; 
    foo(array); 
    foo(array2); 
    return 0; 
} 
+0

+1,是的,所以完整的答案是:你不能從指向數組的指針的數組大小,但如果它是一個選項,而不是傳遞指向數組的指針,你可以將引用傳遞給一個數組,那麼你可以使用這個答案的代碼獲得大小 – stefanB

5

C++有適當的字符串類型:

std::string

,你可能會發現有用的在這裏。即使你將它傳遞給接受const char*的函數,它也有.c_str()方法,允許您將它傳遞給接受指針的函數。如果其他函數需要修改字符串,則可以使用&str[0],該許可證適用於C++的許多實現,並且需要爲C++ 11工作。只要確保你調整大小()他們到正確的大小。

一些在C++中的其他容器的有:

std::array(C++ 11)恆定大小的陣列。它比普通的舊C數組好,因爲它有size()方法。 std::vector動態數組(Java ArrayList等效)

至於你的問題 - 沒有辦法找到一個尖的數組的大小。你怎麼能這樣做?這只是一個愚蠢的指針。

+0

**即使你將它傳遞給接受char *的函數,它也有.c_str()方法,允許你將它傳遞給接受指針的函數。 ==>這是不正確的。 'c_str()'成員函數返回一個'const char *'。 –

+0

@HappyGreenKidNaps你說得對。這是我的疏忽。 – milleniumbug

0

如果你想保持簡單而不使用#include <array.h>,你可以創建一個數組大小爲的結構體。像一點點:

struct 
{ 
    int* int_Array; 
    int array_Size; 
} 

這樣一來,你可以到任何你想要的(如刪除您的實例或東西)