2009-05-07 13 views
16

unsigned char *の長さはどのようにして決まりますか?unsigned char *の長さはどのようにして決まりますか?

+2

ほとんどの答えは、要素の数、ポインタを含む変数のサイズ、または(符号なしの)文字をゼロ終了文字列と呼んでいますか?という意味の "長さ"を指定する必要があることを示していますか? – xtofl

答えて

21

ポインタの実際のサイズの場合:

size_t s = sizeof(unsigned char*); 

あなたは、文字列の長さが必要な場合:unsigned char型によって

unsigned char* bla = (unsigned char*)"blabla"; 
int s = strlen((char*)bla); 
+5

"blabla"は読み取り専用文字列を生成するので、blaはconst unsigned char *でなければなりません。 –

+2

これはコンパイルしないでください。 "blabla"はconst char *です。const char *をunsigned char *に代入することはできません。 –

+0

これは割り当てではなく、常に初期化されています。 –

-3

を*私はあなたがそのポインタの位置の文字列を意味しているとします。その場合、次のようになります。

strlen(your_string_pointer) 

ただし、これは\ 0位置のみを検出します。保証されていないのは、実際に割り当てられたメモリブロックサイズです。

+0

http://www.cplusplus.com/reference/clibrary/cstring/strlen ... strlenは "const char *"を取ります。 – xtofl

8

これには2つの意味があります。あなたはちょうどポインタの種類の大きさを知りたいですか?そうしてJoceの答えが正しい

size_t size = sizeof(unsigned char*); 

ある場合は、ポインタにポイントを行いますどのように多くの要素を知りたい場合は、それは少し複雑です。これがCスタイルの文字列であれば、strlenまたはいくつかの亜種が最適です。

しかし、これがCスタイルの文字列と関係のないunsigned charへのポインタにすぎない場合は、探しているものを確実に達成する方法がありません。 C/C++では、長さフィールドをポインタに関連付けません。あなたは、ポインタで長さを渡すか、ポインタと長さの両方を格納するベクトルのようなクラスを使用する必要があります。

+1

あなたは割り当てられた長さを取得することができないということは正しくありません。 2つの意味があるのは間違っています。つまり、ゼロで終了する文字列の長さを知る必要があるかもしれませんが、符号付きのcharを使う方が良いでしょう。 2分半にしてください:) – xtofl

0

ポインタの長さをintにしますか?指されている文字列の長さが必要な場合は、strlen: などを使用します。ポインタの サイズ:文字列のはsizeof(unsigned char型の*) サイズ:あなたはC++、およびその文字列を使用している場合はstrlenを(unsigned char型の*) マルチバイト文字は..multiバイト

+1

実際には、サイズは – Tom

+0

です。私はsize_t – Rohit

0

として報告されますunsigned char *では、操作する前にまずstd :: stringに入れておくほうがよいでしょう。そうすれば、あなたはあらゆる種類のことをやり遂げることができ、必要に応じていつでも長さや容量を得ることができます。

私はあなたがその配列にサイズを不変にするために何かをしていると仮定しています。割り当て、設定、忘れているだけの場合は、配列の実際の割り当てサイズを別々の変数に格納することができます。構造体/クラスを作成することもできます。

//WARNING: memory issues not addressed here. 
struct myStringStruct 
{ 
    unsigned char * string; 
    int len; 

    allocate(int size) { 
    len = size; 
    string = malloc(sizeof(unsigned char) * len); 
    } 
} 

これ以上複雑ではなく、あなたはstd :: stringを再発明しています。

6

理想的な世界では、あなたはそうではありません。あなたは、Cスタイルの文字列(NULで終了し、長さを測定することができます)とunsigned char *にはchar *を使用します(長さは別のパラメータなどで、おそらく例えばvector<unsigned char>またはbasic_string<unsigned char>のようなSTLコンテナ)。

根本的な問題は、charとunsigned charの記憶表現が同じかどうかについて、移植性のある仮定をすることができないことです。彼らは通常はそうですが、そうでないことは許されています。したがって、unsigned char *を扱う文字列のようなライブラリ関数はchar *のみではなく、unsigned char *をsigned char *にキャストしてその結果を文字列として扱うのは一般的に安全ではありません。 charは署名されている可能性があるので、unsigned char *をchar *にキャストしないことを意味します。

ただし、0は常にunsigned charとcharの値表現と同じです。非理想的な世界では、どこかからCスタイルの文字列が得られていても、それがunsigned char *として到着していれば、(a)char *にキャストして取得しますが、(b )誰があなたにこれをしたかを見つけて、彼らに止めてください。

関連する問題