char str [12]を要求した場合、12文字が予約されますか?
はい、これはスタックに12文字(バイト)を予約します。
その後、メモリが割り当てられたと思いますか?
str
スタックに割り当てられた12バイトの連続メモリの先頭を指すようになりました。
では、ヌル終了はどのように機能しますか?それは12文字の終わり(スペースが埋め込まれていますか?)ですか、それとも数字が2文字しか使用していない場合、2文字の後に発生しますか?
この場合、文字列を自分でnullで終了する必要があります(このタイプの宣言では自動的に発生しません)。
したがって、str
(nullで終了する)文字列値を保持したい場合は、次のようにします。
str[0] = 'c';
str[1] = 'a';
str[2] = 't';
str[3] = '\0';
nullで終了する文字列を取得する別の方法は、次のことを行うことです。
char *str = "cat"; // this is null-terminated
スペースによる自動パディングはありません。
また、後で単純な構造体でポインタを使用した場合、メモリは自動的にクリアされますか、それともデストラクタが必要ですか?
ポインタがスタックに割り当てられたメモリの一部を指している場合、スタックがポップされたときにメモリが回復されます。それ以外の場合、次のようにヒープにメモリを割り当てる場合:
char *newStr = new char[12];
char *mallocStr = (char*) malloc(sizeof(char) * 12);
delete
次に、またはを使用してメモリの割り当てを解除する必要がありますfree
(使用した方法によって異なります)。
デストラクタは初期化バッファサイズを知る必要がありますか?
このコンテキストでは、ヒープに割り当てられたメモリについて話しているため、答えはノーです。システムは、割り当てられたメモリの量を認識しています。そのため、サイズを指定する必要はなく、ポインタを指定するだけですdelete
。free
実際の数からバッファ長を計算する必要がないのはなぜですか?
数が特定の量(たとえば4桁)を超えることは決してないことがわかっている場合は可能ですが、最終的には文字列ごとに数バイトしか無駄にしないため、通常は可能な最大長を指定する方が簡単です。非常に厳しいメモリ制約がない限り、大したことではありません。
snprintfはitoaよりも推奨されていますか?
snprintf
与えられたバッファサイズを尊重するので「安全」と見なされるので、「はい」と言いますがitoa
、サイズをチェックせずにバッファを問題なくいっぱいにします(割り当てられたスペースを超えて実行され、他のメモリを上書きする可能性があります)。
int num = 12345;
char *str = new char[4];
// this is bad because str is not big enough to hold the number
// itoa does not check buffer size and will overrun the buffer (overwriting other data)
str = itoa(num, str);
// snprintf takes the buffer size as one of it's arguments
// in this case the whole number will not fit, but at least we don't overrun the buffer
snprintf(str, 4, "%i", num);
snprintf
とは両方ともitoa
、文字列をnullで終了します。