驚くほど単純/愚か/基本的な質問ですが、私にはわかりません。関数の最初で長さがわからないC文字列を関数のユーザーに返したいとします。最初は長さの上限しか設定できず、加工によってはサイズが小さくなる場合があります。
問題は、十分なヒープスペース(上限)を割り当ててから、処理中にそれよりもかなり短い文字列を終了することに何か問題がありますか?つまり、割り当てられたメモリの中央に「\ 0」を貼り付けてfree()
も、(a。)は正常に機能し、(b。)「\ 0」の後のスペースは重要ではなくなりますか?'\ 0'が追加されると、メモリは返されるだけですか、free()
それとも呼び出されるまでそこにホギングスペースがありますか?mallocを呼び出す前に必要なスペースを計算するための事前のプログラミング時間を節約するために、このハンギングスペースをそこに残すのは一般的に悪いプログラミングスタイルですか?
これにコンテキストを与えるために、次のように、連続する重複を削除したいとします。
「HellooOOOo!!」と入力します ->「HelooOo!」を出力
...そして、以下のコードは、操作の結果として生じるサイズを事前に計算し、ヒープサイズを正しくするために2回処理を効果的に実行する方法を示しています。
char* RemoveChains(const char* str)
{
if (str == NULL) {
return NULL;
}
if (strlen(str) == 0) {
char* outstr = (char*)malloc(1);
*outstr = '\0';
return outstr;
}
const char* original = str; // for reuse
char prev = *str++; // [prev][str][str+1]...
unsigned int outlen = 1; // first char auto-counted
// Determine length necessary by mimicking processing
while (*str) {
if (*str != prev) { // new char encountered
++outlen;
prev = *str; // restart chain
}
++str; // step pointer along input
}
// Declare new string to be perfect size
char* outstr = (char*)malloc(outlen + 1);
outstr[outlen] = '\0';
outstr[0] = original[0];
outlen = 1;
// Construct output
prev = *original++;
while (*original) {
if (*original != prev) {
outstr[outlen++] = *original;
prev = *original;
}
++original;
}
return outstr;
}