char *変数に文字列を割り当てることができ、以前にメモリを割り当てる必要がないのはどうしてですか?
たとえば、関数がchar *(たとえば、ファイルパス)を返す場合、この方法で関数を呼び出します。
char* path;
path = get_path();
パスの長さがわからない場合、char *の動作をどのように期待できますか?「パス」に割り当てる前にパスのサイズを割り当てる必要がありますか?
char *変数に文字列を割り当てることができ、以前にメモリを割り当てる必要がないのはどうしてですか?
たとえば、関数がchar *(たとえば、ファイルパス)を返す場合、この方法で関数を呼び出します。
char* path;
path = get_path();
パスの長さがわからない場合、char *の動作をどのように期待できますか?「パス」に割り当てる前にパスのサイズを割り当てる必要がありますか?
あなたのコードでは:
char* path;
path = get_path();
get_path
文字列へのポインタ(または同等に、文字列のアドレス)を返します。(文字列へのポインタは、その最初の文字へのポインタです)。割り当ては、そのポインタ値をコピーして、に格納するだけですpath
。
関数自体は、get_path
何らかの方法で文字列を保持するためのスペースを割り当てている必要があります。
それを行うことができたいくつかの方法があります。スペースが不要になったときにスペースの割り当てを解除するのは、呼び出し元の責任であると考える人もいます。
読むことをお勧めします:comp.lang.c FAQ、特にセクション4(ポインター)、6(配列とポインター)、7(メモリ割り当て)、および8(文字と文字列)。
この場合、get_path()
関数はそれ自体のメモリバッファへのポインタを返します。問題は、誰がそのメモリを割り当て、誰がそれを解放する責任があるのかということです。
char *path;//path is just a pointer
get_path()でパス文字列にメモリを割り当てると、pointer(char * path)がそのメモリを指すようになります。
ではget_path
、すでに割り当てられている変数へのポインタを返す必要があります。このような:
char *get_path()
{
char *var = (char*)malloc(sizeof(char)*n);
setdirectory(var);
return var;
}
ここn
で、はディレクトリのサイズです。
しかし、ディレクトリのサイズではないと言ったので、その名前を取得し、単語を数え、別の量のメモリ(そのときは正確な量)を割り当て、もう一方のメモリを解放します。それはメモリ使用量に役立ちます。