我遇到了一些函数,比如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的地址传递到函数中吗?
这是为了让 strtok
能够从上次停止的地方继续执行。这个版本的 strtok
是线程安全的(因为它使用你提供的指针而不是其他版本的内部指针)。
它将最后读取的标记的地址保存在一个 char *
中,所以你需要传递一个指向该指针的指针,以便它可以更改该值并将其返回给你。
因为 strtok
不是可重入的,而 strok_r
是可重入的。这意味着您不能从多个线程安全地调用它。为了解决这个问题,函数需要在某个地方存储其状态,可以通过传递指向指针的指针来实现,以便 strok_r 能够修改作为参数传递的指针(另一个指针)的值。
strtok_r(str, delimiter, &foo)
函数将其输出放入 foo
中,并需要指向它的指针,以便不仅替换(复制的)输入对象。
int
或者一个struct
的地址的原因与传递其他参数的原因相同:因为 C 是按值传递的。 - dmckee --- ex-moderator kitten