2013-01-18 106 views
3

我遇到了类似strtok_s的函数,您需要将指针传递给指针参数。为什么要将指针的地址传递给函数C

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

的方式来使用它:

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

想知道为什么指针foo的地址传递到功能?

+0

与传递int或struct的地址相同的原因:因为c传递值。 – dmckee

+0

你是对的! – Rn2dy

回答

2

这样strtok可以从停止的地方恢复。 strtok这个版本是线程安全的(因为它使用了你提供的指针,而不是其他版本的内部指针)。

它将最后一个令牌的地址保存在char *中,因此您需要将指针传递给该指针,以便它可以更改该值并将其返回给您。

0

函数strtok_r(str, delimiter, &foo)将其输出输入foo,并且需要一个指向它的指针才能不替换(复制的)输入对象。

1

因为strtok不是可重入的,而strok_r是。这意味着你不能从多个线程安全地调用它。为了解决这个问题,函数需要在某处存储它的状态,这可以通过传递一个指针指向一个指针来完成,这样strok_r就可以修改传递的指针(这是另一个指针)的值作为参数。