web-dev-qa-db-ja.com

符号なしCharを初期化する適切な方法*

_unsigned char*_を初期化する適切な方法は何ですか?私は現在これをやっています:

_unsigned char* tempBuffer;
tempBuffer = "";
_

または、memset(tempBuffer, 0, sizeof(tempBuffer));を使用する必要がありますか?

16
Brian

2番目の方法では、nullポインターが残ります。ここではバッファ用のスペースを宣言していないことに注意してください。他の場所で作成する必要があるバッファへのpointerを宣言しています。これを""に初期化すると、ポインタは1バイトの静的バッファ(nullターミネータ)を指すようになります。後で文字を書き込めるバッファが必要な場合は、Fredの配列の提案またはmallocなどを使用してください。

9
Karl Bielefeldt

ポインタを「適切に」初期化するには(例のようにunsigned char *)、単純な

unsigned char *tempBuffer = NULL;

unsigned charsの配列を初期化する場合は、次のいずれかを実行できます。

unsigned char *tempBuffer = new unsigned char[1024]();
// and do not forget to delete it later
delete[] tempBuffer;

または

unsigned char tempBuffer[1024] = {};

次のように初期化できるstd::vector<unsigned char>もご覧になることをお勧めします。

std::vector<unsigned char> tempBuffer(1024, 0);
21
Dmitry

これはポインタなので、次のように最初にNULLに初期化する必要があります。

unsigned char* tempBuffer = NULL;
unsigned char* tempBuffer = 0;

または、次のように変数のアドレスを割り当てます。

unsigned char c = 'c';

unsigned char* tempBuffer = &c;

編集:文字列を割り当てる場合は、次のように実行できます。

unsigned char myString [] = "This is my string";
unsigned char* tmpBuffer = &myString[0];
6
Kerri Brown

コンパイル時にバッファのサイズがわかっている場合:

unsigned char buffer[SIZE] = {0};

動的に割り当てられたバッファーの場合(実行時に割り当てられるバッファーまたはheap):

1. new演算子を優先します。

unsigned char * buffer = 0;  // Pointer to a buffer, buffer not allocated.
buffer = new unsigned char [runtime_size];

2.「初期化」または単純な値で埋める多くのソリューション:

std::fill(buffer, buffer + runtime_size, 0); // Prefer to use STL
memset(buffer, 0, runtime_size);
for (i = 0; i < runtime_size; ++i) *buffer++ = 0;  // Using a loop

3.C言語側は、1回の呼び出しで割り当てと初期化を提供します。
ただし、関数はオブジェクトのコンストラクターを呼び出しません:

buffer = calloc(runtime_size, sizeof(unsigned char))

これにより、バッファ内のすべてのビットがゼロに設定されることに注意してください。初期値では選択肢がありません。

4
Thomas Matthews

それはあなたが何を達成したいかに依存します(例えばあなたは文字列を変更したいですか?)たとえば、 http://c-faq.com/charstring/index.html 詳細については。

文字列リテラルへのポインタを宣言する場合、それはconstである必要があります。つまり、

const unsigned char *tempBuffer = "";
2

プランがそれがバッファであり、後で何かを指すように移動したい場合は、空の文字列ではなく、書き込みたい場所を実際に指すまでNULLに初期化します。

unsigned char * tempBuffer = NULL;
std::vector< unsigned char > realBuffer( 1024 );
tempBuffer = &realBuffer[0]; // now it really points to writable memory
memcpy( tempBuffer, someStuff, someSizeThatFits );
1
CashCow

答えは、unsigned charを何に使用するかによって異なります。 charはnothing以外の小さな整数ですが、すべての実装の99%でサイズは8ビットです。

Cには、charとうまく適合する文字列サポートがありますが、charの使用が文字列に制限されるわけではありません。


ポインターを初期化する適切な方法は、1)スコープと2)使用目的によって異なります。

ポインターが静的に宣言されている、またはファイルスコープで宣言されている場合、ISO C/C++は、ポインターがNULLに初期化されることを保証します。プログラミングスタイルの純粋主義者は、スタイルをローカルスコープ変数と一致させるためにNULLに設定しますが、理論的にはそうすることは無意味です。

何を初期化するかについては... NULLに設定します。 ""を指すように設定しないでください。これにより、ヌル終端を含む静的ダミーバイトが割り当てられ、ポインターが別の何かに割り当てられるとすぐに、小さな静的メモリリークが発生します。

そもそもなぜそれを何にでも初期化する必要があるのか​​疑問に思うかもしれません。使用する前に、有効な値に設定してください。有効な値を与える前にポインターを使用することを心配する場合は、そのような単純なバグを見つけるための適切な静的アナライザーを入手する必要があります。ほとんどのコンパイラーでもそのバグをキャッチして警告を出します。

1
Lundin