私は C/C++ が初めてです。
ツリーに関連するコーディングの質問をいくつか行っていたところ、この二重ポインター表記に出くわしました。以下の関数の最初の引数として単一ポインターを使用して、二重ポインターでできるのと同じことを行うことができますか。
void operate(struct Node *root, struct Node **head_ref){ //do something}
malloc を処理する関数が必要な場合、free が主な理由です。
これは、メモリ割り当てをカプセル化する場合に役立ちます。
たとえば、init(struct some_struct **)、free(struct some_struct **) などです。そして、関数が malloc、free を処理するようにします。スタックに割り当てる代わりに。
たとえば、長さが不明な文字列をパックする関数。
size_t pack_struct(char** data, const struct some_struct * some_struct)
{
/**
* @brief buffer
* @note verify the needed buffer length
*/
char buffer [256]; // temporary buffer
*data = 0;
//const char* package_pattern = "%cW ;%u.%u;%s%c";
size_t len = sprintf(buffer, weight_package_pattern,
START_CHARACTER,
some_struct->ts.tv_sec,
some_struct->ts.tv_usec,
some_struct->string_of_unknown_length, // but no more then buffer
STOP_CHARACTER);
if(len == 0) {
perror("sprintf failed!\n");
return len;
}
// len++; // for end character if wanna some, see sprintf description
*data = (char*)malloc(len*sizeof(char)); // memory allocation !
strncpy(*data, buffer, len);
return len;
}
ただし、C++ でプログラミングする場合は、このような手法を避ける必要があります。