3

ポインター引数へのポインターを渡す必要がある strtok_s のような関数に出くわします。

strtok_r(char *restrict str, const char *restrict sep, char **restrict lasts);

使用方法は次のとおりです。

char *foo;
char *str = ...;
char *delimiter = ...;
strtok_r(str, delimiter, &foo);

なぜポインター foo のアドレスを関数に渡すのか疑問に思っていますか?

4

3 に答える 3

2

strtok中断したところから再開できるようにするためです。このバージョンのstrtokはスレッドセーフです(他のバージョンの内部ポインターではなく、指定したポインターを使用するため)。

最後に読み取られたトークンのアドレスが保存されるchar *ため、値を変更して返すことができるように、そのポインターにポインターを渡す必要があります。

于 2013-01-18T05:09:30.487 に答える
1

strtokは再入可能ではないためstrok_rです。これは、複数のスレッドから安全に呼び出すことができないことを意味します。これを修正するには、関数がそのステータスをどこかに保存する必要があります。これは、ポインターにポインターを渡すことで実行できます。これにより、strok_r は、渡されたポインター (別のポインター) の値を引数として変更できます。

于 2013-01-18T05:12:35.323 に答える
0

この関数は、(コピーされた)入力オブジェクトを置き換えるだけでなく、strtok_r(str, delimiter, &foo)その出力をに入れ、それへfooのポインターを必要とします。

于 2013-01-18T05:10:03.540 に答える