2013-04-02 23 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::arrayまたはstd::vectorまたはそれに類するものを使用して、長さを記録しておくこともできます。

+0

hmmしかし、私の最後のコードブロックは39、+1 = 40でした。なぜこれは悪いですか? –

+0

@JavaNewb:あなたは、配列の終わりを未定義のメモリに読み込んでいます。これはクラッシュを引き起こす可能性があります。 – RichieHindle

3

できません。道徳的なことは、ポインタと配列を使わず、ベクトルを使うことです。あなたはいつもベクトルのサイズを得ることができます。

3

ポインタから配列の要素への配列のサイズを取得することはできません。

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

が、あなたは、配列のサイズを取得する代わりに、テンプレート機能を使用することができます:あなたはこのような引数として配列パラメータを取る関数を実装しているので、あなただけのポインタを持っている理由がある場合

関数に渡します。あなたがここに役に立つかもしれません

std::string

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++は、適切な文字列型を持っています。 const char*を受け付ける関数に渡しても、ポインタを受け入れる関数に渡すことができる方法は.c_str()です。他の関数が文字列を変更する必要がある場合は、&str[0]を使用できます。これはC++の多くの実装で有効で、C++ 11で動作する必要があります。正しいサイズにサイズ変更してください()。 C++の他のコンテナの

いくつかは、一定の大きさの

std::array(C++ 11)アレイ。それはsize()メソッドを持っているので、普通の古いC配列よりも優れています。 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; 
} 

そのように、何でもあなたが(あなたのインスタンスか何かの削除など)たい

関連する問題