9

char * のようなパラメーターを参照として渡す方法は?

私の関数は malloc() を使用します

void set(char *buf)
{
    buf = malloc(4*sizeof(char));
    buf = "test";
}

char *str;
set(str);
puts(str);
4

6 に答える 6

19

ポインターのアドレスを渡します。

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);
于 2012-04-11T13:50:52.140 に答える
5

ポインターへのポインターとして渡す必要があります。

void set(char **buf)
{
    *buf = malloc(5 * sizeof(char));
    strcpy(*buf, "test");
}

次のように呼び出します。

char *str;
set(&str);
puts(str);
free(str);

5 文字を割り当てるように呼び出しを変更したことに注意してください。これはmalloc、実際の文字のみを割り当てるためですが、文字列には特殊な終了文字も含まれており、そのためのスペースも必要です。

strcpy文字列を割り当てられたメモリにコピーするためにも使用します。これは、そうでなければポインタを上書きしているためです。つまり、割り当てたポインタが失われ、メモリ リークが発生します。

また、ポインターを使い終わったら、ポインターを覚えておく必要がありますfree。そうしないと、プログラムが終了するまでメモリが割り当てられたままになります。

于 2012-04-11T13:51:10.577 に答える
4

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);
于 2012-04-11T13:51:24.877 に答える
3

ポインターにポインターを渡す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);
于 2012-04-11T13:51:32.030 に答える
1

C は値渡しです。参照渡しはありません。

于 2012-04-11T13:50:41.860 に答える
0

C は参照によって関数の引数を渡すことはできません。C は常に値によって渡します。

Kernighan & Ritchie より:

(K&R 2nd, 1.8 Call by value) 「C では、すべての関数引数は「値」で渡されます」

へのポインターを変更するには、ポインターへのポインターを関数の引数の型としてT持つことができます。T

于 2012-04-11T13:53:54.387 に答える