2013-01-18 102 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就可以修改傳遞的指針(這是另一個指針)的值作爲參數。