Charポインターでmallocを使用するタイミングに特に焦点を当てています
char *ptr;
ptr = "something";
...code...
...code...
ptr = "something else";
これほど些細なことをするために、mallocは必要でしょうか?はいの場合、なぜですか?そうでない場合、charポインタにはいつ必要ですか?
他の人によって示されたように、あなただけのためにmallocを使用する必要はありません:
_const char *foo = "bar";
_
その理由は、まさに_*foo
_ isポインター— foo
を初期化するとき、文字列のコピーを作成するのではなく、単に_"bar"
_は、実行可能ファイルのデータセクションにあります。ポインタは何度でもコピーできますが、常にその文字列の同じ単一のインスタンスを指していることを忘れないでください。
それでは、いつmallocを使用する必要がありますか?通常、strdup()
を使用して、mallocをバックグラウンドで処理する文字列をコピーします。例えば.
_const char *foo = "bar";
char *bar = strdup(foo); /* now contains a new copy of "bar" */
printf("%s\n", bar); /* prints "bar" */
free(bar); /* frees memory created by strdup */
_
ここで、sprintf()
を使用している場合、またはより安全に新しい文字列を作成/フォーマットするsnprintf()
を使用している場合にmallocを使用する場合があります。
_char *foo = malloc(sizeof(char) * 1024); /* buffer for 1024 chars */
snprintf(foo, 1024, "%s - %s\n", "foo", "bar"); /* puts "foo - bar\n" in foo */
printf(foo); /* prints "foo - bar" */
free(foo); /* frees mem from malloc */
_
malloc
は、フリーストアのメモリを割り当てるためのものです。変更したくない文字列リテラルがある場合は、次のことは問題ありません。
char *literal = "foo";
ただし、変更できるようにするには、入力行を保持するためのバッファーとして使用するなど、malloc
を使用します。
char *buf = (char*) malloc(BUFSIZE); /* define BUFSIZE before */
// ...
free(buf);
コンパイル時に必要なメモリ量がわからない場合は、malloc()
を使用します。読み取り専用の文字列がある場合は、_const char* str = "something";
_を使用できます。文字列はほとんどの場合、読み取り専用のメモリの場所に保存されているため、変更することはできません。一方、コンパイル時に文字列を知っている場合は、次のようなことができます。char str[10]; strcpy(str, "Something");
ここで、メモリはスタックから割り当てられ、strを変更できます。 3番目のケースは、mallocを使用した割り当てです。コンパイル時に文字列の長さがわからないとしましょう。その後、char* str = malloc(requiredMem); strcpy(str, "Something"); free(str);
を実行できます
単一の文字または整数の場合はmalloc、動的配列の場合はcalloc。すなわち、pointer = ((int *)malloc(sizeof(int)) == NULL)
、malloc
の括弧内で算術を行うことができますが、void calloc(count, size)
の定義を持つcalloc
を使用する必要があるため、すべきではありません。あなたが保存したい多くのアイテム、すなわちデータの数とサイズ、すなわちint
、char
など。
コンパイル時に文字列のサイズが不定になるたびに、malloc(または同等の方法)でメモリを割り当てる必要があります。あなたの場合、コンパイル時の文字列のサイズ(sizeof( "something")およびsizeof( "something else"))を知っています。