char * のようなパラメーターを参照として渡す方法は?
私の関数は malloc() を使用します
void set(char *buf)
{
buf = malloc(4*sizeof(char));
buf = "test";
}
char *str;
set(str);
puts(str);
char * のようなパラメーターを参照として渡す方法は?
私の関数は malloc() を使用します
void set(char *buf)
{
buf = malloc(4*sizeof(char));
buf = "test";
}
char *str;
set(str);
puts(str);
ポインターのアドレスを渡します。
void set(char **buf)
{
*buf = malloc(5*sizeof(char));
// 1. don't assign the other string, copy it to the pointer, to avoid memory leaks, using string literal etc.
// 2. you need to allocate a byte for the null terminator as well
strcpy(*buf, "test");
}
char *str;
set(&str);
puts(str);
ポインターへのポインターとして渡す必要があります。
void set(char **buf)
{
*buf = malloc(5 * sizeof(char));
strcpy(*buf, "test");
}
次のように呼び出します。
char *str;
set(&str);
puts(str);
free(str);
5 文字を割り当てるように呼び出しを変更したことに注意してください。これはmalloc
、実際の文字のみを割り当てるためですが、文字列には特殊な終了文字も含まれており、そのためのスペースも必要です。
strcpy
文字列を割り当てられたメモリにコピーするためにも使用します。これは、そうでなければポインタを上書きしているためです。つまり、割り当てたポインタが失われ、メモリ リークが発生します。
また、ポインターを使い終わったら、ポインターを覚えておく必要がありますfree
。そうしないと、プログラムが終了するまでメモリが割り当てられたままになります。
C は参照渡しをサポートしていません。ただし、ポインターにポインターを渡して、次のように設定できます。
void set(char **buf)
{
*buf = malloc(5*sizeof(char)); //5, to make room for the 0 terminator
strcpy(*buf,"test"); //copy the string into the allocated buffer.
}
char *str;
set(&str);
puts(str);
ポインターにポインターを渡すchar**
: C には参照がありません。
void set(char** buf)
{
*buf = malloc(5); /* 5, not 4: one for null terminator. */
strcpy(buf, "test");
}
ご了承ください:
buf = "test";
にコピー"test"
するのではなく、文字列リテラルのアドレスをbuf
指します。を使用してコピーします。buf
"test"
strcpy()
free()
不要になったときにバッファーを返すことを忘れないでください。
char* str;
set(&str);
puts(str);
free(str);
C は値渡しです。参照渡しはありません。
C は参照によって関数の引数を渡すことはできません。C は常に値によって渡します。
Kernighan & Ritchie より:
(K&R 2nd, 1.8 Call by value) 「C では、すべての関数引数は「値」で渡されます」
へのポインターを変更するには、ポインターへのポインターを関数の引数の型としてT
持つことができます。T