unsigned char* の長さはどのように決定しますか?
7 に答える
ポインターの実際のサイズ:
size_t s = sizeof(unsigned char*);
文字列の長さが必要な場合:
unsigned char* bla = (unsigned char*)"blabla";
int s = strlen((char*)bla);
理想的な世界では、そうではありません。C スタイルの文字列 (NUL で終了し、長さを測定できる) には char* を使用し、バイト データには unsigned char* のみを使用します (これは、別のパラメーターなどに長さが含まれており、おそらくそれに入るでしょう)。vector<unsigned char>
やなどの STL コンテナーをできるだけ早く作成しbasic_string<unsigned char>
ます)。
根本的な問題は、char と unsigned char のストレージ表現が同じかどうかについて、移植可能な仮定を立てることができないことです。通常はそうですが、そうでないことは許されています。そのため、unsigned char* を操作する文字列のようなライブラリ関数はなく、char* のみを操作します。一般に、unsigned char* を signed char* にキャストして結果を文字列として扱うことは安全ではありません。char は署名されている可能性があるため、unsigned char* を char* にキャストしないことを意味します。
ただし、0 は unsigned char と char で常に同じ値表現です。したがって、非理想的な世界では、C スタイルの文字列をどこかから取得したものの、それが unsigned char* として到着した場合、(a) それを char* にキャストして処理を進めますが、(b )誰があなたにこれをしたかを見つけて、止めてください。
これには2つの意味が考えられます。ポインター型の大きさを知りたいだけですか? もしそうなら、Joceの答えは正しいです
size_t size = sizeof(unsigned char*);
ポインターが指している要素の数を知りたい場合は、もう少し複雑です。これが C スタイルの文字列の場合は、strlen またはその変形が最適なオプションです。
ただし、これが C スタイルの文字列とは関係のない unsigned char への単なるポインターである場合、探しているものを確実に実現する方法はありません。C / C++ は、長さフィールドをポインターに関連付けません。ポインターで長さを渡すか、ポインターと長さの両方を格納する vector のようなクラスを使用する必要があります。
C ++を使用していて、その文字列が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を再発明しています。
int になるポインターの長さが必要ですか。指している文字列の長さが必要な場合は、strlen を使用します。たとえば、ポインタのサイズ: sizeof(unsigned char*) 文字列のサイズ: strlen(unsigned char*) マルチバイト文字は ..multi バイトとして報告されます。
unsigned char * とは、そのポインターにある文字列を意味していると思います。その場合、次のようになります。
strlen(your_string_pointer)
ただし、これは \0 の位置しか見つけられません。これが実際に割り当てられたメモリ ブロック サイズであるという保証はありません。