2013-04-02 15 views
14

Mam problem ze znalezieniem długości tablicy wskaźnika. Powiedzmy, że mam:C++ Jak uzyskać długość tablicy wskaźnika?

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

// Jak uzyskać długość tablicy z tylko wskaźnikiem do pierwszego elementu w tej tablicy?

char* pchar = array; 

// jeśli

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

// jeśli

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

Jak mogę zmusić go do powrotu długość 40 tylko ze wskaźnikiem do pierwszego elementu w tablicy?
Znalazłem, że mogę to zrobić.

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

     count++; 
    } 

To zwraca 39, to jest dobre, ale mam wrażenie, że w niektórych sytuacjach może to być błędne.

+13

nie można uzyskać długość tablicy ze wskaźnikiem. – juanchopanza

+0

Są hacki, ale nie ma wbudowanego sposobu na zrobienie tego. – ApproachingDarknessFish

Odpowiedz

15

Nie, obawiam się. Musisz przekazać długość tablicy każdemu, kto jej potrzebuje. Możesz też użyć modelu std::array lub podobnego, który sam monitoruje długość.

+0

hmm, ale mój ostatni blok kodu zwrócił 39, +1 = 40. dlaczego to jest złe? –

+0

@JavaNewb: Czytasz koniec tablicy w pamięci niezdefiniowanej, co prawdopodobnie spowoduje awarię. – RichieHindle

3

Nie możesz. A morałem jest, nie używaj wskaźników i tablic, używaj wektorów. Zawsze możesz uzyskać rozmiar wektora.

3

To prawda, że ​​nie można uzyskać rozmiaru tablicy od wskaźnika do elementu tablicy.

Jeśli powodem masz tylko wskaźnik dlatego, że realizują funkcję, która przyjmuje parametr tablicę jako argument jak ten:

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

Następnie można użyć funkcji szablonu zamiast uzyskać rozmiaru tablicy do funkcji.

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, tak, więc pełna odpowiedź byłaby następująca: nie można uzyskać rozmiaru tablicy od wskaźnika do tablicy, ale jeśli jest to opcja zamiast przekazywania wskaźnika do tablicy do funkcji, można przekazać odwołanie do tablicy i następnie możesz uzyskać rozmiar za pomocą kodu z tej odpowiedzi – stefanB

5

C++ ma właściwego typu string:

std::string

, które mogą okazać się przydatne tutaj. Nawet jeśli przekazujesz go do funkcji, która akceptuje const char*, ma on metodę .c_str(), która pozwala przekazać ją do funkcji akceptującej wskaźnik. Jeśli druga funkcja wymaga modyfikacji ciągu znaków, możesz użyć &str[0], która jest poprawna dla wielu implementacji C++ i jest wymagana do pracy dla C++ 11. Po prostu upewnij się, że zmieniasz rozmiar() na właściwy rozmiar.

Niektóre z innych pojemników C++ są:

std::array (C++ 11) Macierz o stałym rozmiarze. Lepsza niż zwykła stara tablica C, ponieważ ma metodę size(). std::vector Dynamiczna tablica (Java ArrayList odpowiednik)

Co do Twojego pytania - nie ma sposobu, aby znaleźć rozmiar spiczastym tablicy. Jak możesz to zrobić? To tylko głupi wskaźnik.

+0

** Nawet jeśli przekazujesz go do funkcji, która akceptuje char *, ma ona metodę .c_str(), która pozwala przekazać ją do funkcji, która akceptuje wskaźnik. ** ==> To jest nieprawidłowe. Funkcja członkowska 'c_str()' zwraca 'const char *'. –

+0

@HappyGreenKidNaps Masz rację. To było moje przeoczenie tutaj. – milleniumbug

0

Jeśli chcesz zachować prostotę i nie używać #include <array.h>, możesz utworzyć strukturę, w której masz rozmiary tablic. Trochę jak:

struct 
{ 
    int* int_Array; 
    int array_Size; 
} 

ten sposób, można by cokolwiek chcesz (jak usuwanie instancji lub coś)

Powiązane problemy